多线程1

来源:互联网 发布:清宫表虚岁准确算法 编辑:程序博客网 时间:2024/06/06 10:43

        所谓的进程就是正在执行的程序,而线程就是程序中负责执行程序的执行单元。一个进程中可以有多个执行单元,称之为多线程。一个进程中至少要有一个线程。开启多个线程的目的是为了同时执行多部分代码,每一个线程都有自己要执行的内容,这个内容就叫做 线程需要执行的任务。

多线程的好处:解决了多部分任务同时执行的问题。

多线程的弊端:线程太多,回收效率低。

1、创建线程的两种方式:

(1)继承Thread类

①定义一个类,并继承Thread类

②覆盖Thread类中的run()方法

③直接创建Thread类的子类对象,创建线程

④调用start()方法开启线程并调用线程中的run(),执行线程中的任务

class Demo extends Thread{Demo(String name){super(name);}public void run(){for(int x=0; x<10; x++){System.out.println("x="+x+"...name="+Thread.currentThread().getName());}}}class  ThreadDemo1{public static void main(String[] args) {Demo d1 = new Demo("旺财");Demo d2 = new Demo("xiaoqiang");d1.start();d2.start();System.out.println("over...."+Thread.currentThread().getName());}}
(2)实现Runnable接口

①定义类实现Runnable接口

②覆盖Runnable接口中的run()方法,将线程的任务封装到run()方法中

③通过Thread类创建对象,并将Runnable接口的子类对象作为参数传入到Thread类的构造函数中,因为线程的任务都封装在Runnable子类对象的run方法中,所以在线程创建时就要明确执行的任务是哪一个。

④调用线程对象的start方法进行开启线程

class Demo implements Runnable{public void run(){show();}void show(){for(int x=0; x<9; x++){System.out.println("x="+x+"...name="+Thread.currentThread().getName());}}}class ThreadDemo2 {public static void main(String[] args) {Demo d = new Demo();Thread t1 = new Thread(d);Thread t2 = new Thread(d);t1.start();t2.start();}}
2、同步代码块和同步方法

        当一个线程在执行操作共享数据的多条代码时,其他线程参与了运算,就会导致安全问题的产生。

解决思路:

        将操作共享数据的多条线程代码封装起来,当有线程在执行这些数据时,其他线程不可以参与运算,必须要当前线程将代码执行完毕后,其他线程才可以参与运算。在Java中可以用同步代码块或同步方法来解决。

同步代码块的格式:

synchronized(对象)

{

需要被同步的代码

}

同步的好处:解决了线程的安全问题。
同步的弊端:相对降低了效率,因为同步外的线程的都会判断同步锁。
同步的前提:同步中必须有多个线程并使用同一个锁。

        同步方法就是用synchronized修饰的函数,同步方法的锁就是this,而同步代码块的锁可以是任意的对象,同步方法可以看做同部代码块的简写格式。静态同步方法的锁是该类所对应的字节码文件,可以用getClass()方法获取,也可以用类名.class表示。

class Bank{private int sum;public synchronized void add(int num){sum = sum +num;try{Thread.sleep(10);}catch(InterruptedException e){}System.out.println("sum="+sum+"...name="+Thread.currentThread().getName());}}class Cus implements Runnable{private Bank b = new Bank();public void run(){for(int x=0; x<3; x++){b.add(100);}}}class ThreadDemo3 {public static void main(String[] args) {Cus c = new Cus();Thread t1 = new Thread(c);Thread t2 = new Thread(c);t1.start();t2.start();}}

0 0
原创粉丝点击