黑马程序员_多线程

来源:互联网 发布:网络攻防技术教材下载 编辑:程序博客网 时间:2024/06/10 19:05

                                  ----------- android培训java培训、java学习型技术博客、期待与您交流! ---------

一.创建线程的方法与步骤:

创建线程的第一种方式:继承Thread ,覆盖run方法

步骤:

1,定义类继承Thread类;

2,目的是复写run方法,将要让线程运行的代码都存储到run方法中;

3,通过创建Thread类的子类对象,创建线程对象;

4,调用线程的start方法,开启线程,并执行run方法。

代码体现:

创建线程的第二种方式:实现一个接口Runnable。

步骤:

1,定义一个类实现Runnable接口。
2,覆盖Runnable接口中的run方法。
将线程要运行的代码存储到run方法中。 
3,创建该接口的子类对象。
4,通过Thread类进行线程的创建,并将Runnable接口的子类对象作为Thread类的构造函数的实参进行传递。
为什么要传递呢?
让线程对象创建时,就要明确要运行哪个run方法,而这个run方法是需要被对象调用的,
所以将run方法所属的对象传递给Thread类的构造函数。
5,调用Thread类中的start方法开启线程。

代码体现:

 

二.线程的安全问题:

(1).产生原因:1,多个线程在操作共享数据。
                       2,操作共享数据的代码有多条。
 一个线程在执行多条操作共享数据的过程中,其他线程参数与了运算,这时就会发生安全问题。

(2).解决方案:只要保证一个线程在执行多条操作共享数据的语句时,其他线程不能参与运算即可。
       当该线程都执行完后,其他线程才可以执行这些语句。

     代码体现:java中给我们提供具体的解决语句。 那就是同步代码块。
格式:
synchronized(对象)//对象可以是任意的对象。
{
         需要被同步的语句。
}

三.线程同步:

1.同步的原理:其实就是将需要同步的代码进行封装,并在该代码上加了一个锁。
2.同步的好处:解决多线程的安全问题。
3.同步的弊端:会降低性能。 
4.同步的前提:
必须要保证在同步中有多个线程。因为同步中只有一个线程该同步是没有意义。
必须要保证多个线程在同步中使用的是同一个锁。
        必须保证多个线程使用的锁是同一个。
这时才成为多个线程被同步了。

5.同步函数:其实就是将同步关键字定义在函数上,让函数具备了同步性。

6.同步代码块和同步函数的区别:

同步代码块使用的锁可以是任意对象。

同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。

 在一个类中只有一个同步,可以使用同步函数。如果有多同步,必须使用同步代码块,来确定不同的锁。所以同步代码块相对灵活一些。

四.线程间通信:

思路:多个线程在操作同一个资源,但是操作的动作却不一样。

1:将资源封装成对象。

2:将线程执行的任务(任务其实就是run方法。)也封装成对象。

五.等待唤醒机制:

涉及的方法:

wait:将同步中的线程处于冻结状态。释放了执行权,释放了资格。同时将线程对象存储到线程池中。

notify:唤醒线程池中某一个等待线程。

notifyAll:唤醒的是线程池中的所有线程。

 注意:

1:这些方法都需要定义在同步中。 

2:因为这些方法必须要标示所属的锁。

你要知道 A锁上的线程被wait了,那这个线程就相当于处于A锁的线程池中,只能A锁的notify唤醒。

3:这三个方法都定义在Object类中。为什么操作线程的方法定义在Object类中?

因为这三个方法都需要定义同步内,并标示所属的同步锁,既然被锁调用,而锁又可以是任意对象,那么能被任意对象调用的方法一定定义在Object类中。

六.Lock接口:多线程在JDK1.5版本升级时,推出一个接口Lock接口。

解决线程安全问题使用同步的形式,(同步代码块,要么同步函数)其实最终使用的都是锁机制。

 到了后期版本,直接将锁封装成了对象。线程进入同步就是具备了锁,执行完,离开同步,就是释放了锁。

在后期对锁的分析过程中,发现,获取锁,或者释放锁的动作应该是锁这个事物更清楚。所以将这些动作定义在了锁当中,并把锁定义成对象。

 所以同步是隐示的锁操作,而Lock对象是显示的锁操作,它的出现就替代了同步。

 在之前的版本中使用Object类中wait、notify、notifyAll的方式来完成的。那是因为同步中的锁是任意对象,所以操作锁的等待唤醒的方法都定义在Object类中。

 而现在锁是指定对象Lock。所以查找等待唤醒机制方式需要通过Lock接口来完成。而Lock接口中并没有直接操作等待唤醒的方法,而是将这些方式又单独封装到了一个对象中。这个对象就是Condition,将Object中的三个方法进行单独的封装。并提供了功能一致的方法 await()、signal()、signalAll()体现新版本对象的好处。

七.总结:创建多线程有两种方式,一种是继承Thread类,覆盖run方法,另一个就是实现Runnable接口。当多个线程操作共享数据时,就会产生安全问题,这时我们可以用同步代码块和同步函数加锁的原理来解决问题,等到了JDK1.5升级后,出现一个Lock接口,直接将锁封成了对象,更加方便的解决了安全问题。

                      --------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima


0 0