标签:
Java提供了3个非常重要的方法来巧妙地解决线程间的通信问题。这3个方法分别是:wait()、notify()和notifyAll()。它们都是Object类的最终方法,因此每一个类都默认拥有它们。
虽然所有的类都默认拥有这3个方法,但是只有在synchronized关键字作用的范围内,并且是同一个同步问题中搭配使用这3个方法时才有实际的意义。
如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。
如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。
下面通过一个实例来说明,2个线程,循环交替打印A、B
package com.smart.concurrency.chapter2;
/**
* @Description
* @author gaowenming
*/
public class WaitAndNotifyTest {
public static final Object obj = new Object();
public static void main(String[] args) throws Exception {
Thread t0 = new Thread(new Thread0());
Thread t1 = new Thread(new Thread1());
t0.start();
t1.start();
}
}
class Thread0 implements Runnable {
@Override
public void run() {
while (true) {
synchronized (WaitAndNotifyTest.obj) {
try {
Thread.sleep(100);
System.out.println("A");
WaitAndNotifyTest.obj.notify();
WaitAndNotifyTest.obj.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
class Thread1 implements Runnable {
@Override
public void run() {
while (true) {
synchronized (WaitAndNotifyTest.obj) {
try {
Thread.sleep(100);
System.out.println("B");
WaitAndNotifyTest.obj.notify();
WaitAndNotifyTest.obj.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
代码中,可以看到2个线程监视的是同一个对象WaitAndNotifyTest.obj,这样才能保证同步操作的有效
A B A B A B A B A B A B
标签:
原文地址:http://my.oschina.net/gaowm/blog/518003