Welcome 微信登录

首页 / 软件开发 / JAVA / Java多线程:“基础篇”05之线程等待与唤醒

Java多线程:“基础篇”05之线程等待与唤醒2014-06-02 cnblogs skywang12345wait(), notify(), notifyAll()等方法介绍

在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入 等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤 醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。

Object类中关于等待/唤醒的API详细信息如下:

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

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

wait()                                         -- 让当前线程处于“等待( 阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”, 当前线程被唤醒(进入“就绪状态”)。

wait(long timeout)                     -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法 或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”) 。

wait(long timeout, int nanos)  -- 让当前线程处于“等待(阻塞)状态”, “直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线 程,或者已超过某个实际时间量”,当前线程被唤醒(进入“就绪状态”)。

2. wait()和notify()示例

下面通过示例演示"wait()和notify()配合使用的情形"。

// WaitTest.java的源码class ThreadA extends Thread{public ThreadA(String name) {super(name);}public void run() {synchronized (this) {System.out.println(Thread.currentThread().getName()+" call notify()");// 唤醒当前的wait线程notify();}}}public class WaitTest {public static void main(String[] args) {ThreadA t1 = new ThreadA("t1");synchronized(t1) {try {// 启动“线程t1”System.out.println(Thread.currentThread().getName()+" start t1");t1.start();// 主线程等待t1通过notify()唤醒。System.out.println(Thread.currentThread().getName()+" wait()");t1.wait();System.out.println(Thread.currentThread().getName()+" continue");} catch (InterruptedException e) {e.printStackTrace();}}}}
运行结果:

main start t1

main wait()

t1 call notify()

main continue