首页 > 代码库 > java多线程学习(四)——线程的交互

java多线程学习(四)——线程的交互

线程交互中用到的三个基本函数:

void notify();唤醒在此对象监视器上等待的单个线程。

void notifyAll();唤醒在此对象监视器上等待的所有线程。

void wait();导致当前的线程等待,直到其他线程调用此对象的notify()或者notifyAll()方法。

void wait(long timeout);wait()的重载版本,同样导致当前线程等待,直到其他线程调用此对象的notify()或者notifyAll()方法,或者等待超过指定的时间后不再等待。

void wait(long timeout,int nanos);wait()的重载版本,同样导致当前线程等待,直到其他线程调用此对象的notify()或者notifyAll()方法,或者等待超过某个实际的时间后不再等待,或者其他某个线程中断当前线程。

在线程交互中需要注意的是:

wait()、notify()、notifyAll()方法必须从同步环境中调用,线程不能调用对象上等待或通知的方法,除非此线程拥有对象的锁。

线程通过执行对象上的wait()方法获得等待列表,此后线程不再执行任何其他指令,直到调用对象的notify()方法为止。当多个线程在同一个对象上等待的时候,则notify()将随机的唤醒其中的一个线程来使其运行。若没有线程等待,则不做任何处理。

要执行wait()方法,前提是当前线程拥有此对象的锁,当执行wait()方法之后,此线程即释放此对象的锁,以便于其他线程中调用notify()或者notifyAll()来唤醒此线程。然而调用notify()时,不意味着线程会释放对象的锁。如果线程依然在完成同步代码,那么线程在完成同步代码块时不会释放对象的锁。所以,notify()并不意味着锁变得可用。


注意的问题:

wait(),notify(),notifyAll()不属于Thread类,而属于Object类,也就是说每个对象都有着三个方法。因为每个对象都有自己的锁,锁是每个对象的基础,操作锁的方法也是每个对象的基础。

wait()导致的是当前的线程的等待,而不是调用对象所在的线程类等待,也就是哪个线程拥有此对象的锁才能调用wait()方法。

notify()唤醒当前对象监视器上等待的单个线程,如果在此对象上有多个线程在等待,则随机的唤醒期中一个线程,直到当前线程放弃此对象上的锁,才能继续执行被唤醒的线程。notify()也和wait()一样,必须由持有此对象的锁的线程来调用,notifyAll()也一样,但是notifyAll()会唤醒在这个对象等待的所有线程,并从这个线程中随机的选择一个。

这三个方法都需要和synchronized配合使用,也就是必须先获取对象的锁,才能调用者三个方法。


java多线程学习(四)——线程的交互