线程间通信的实现 wait()和notify()方法

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


你可能感兴趣的:(线程间通信的实现 wait()和notify()方法)