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
时间: 2024-10-07 01:29:40