一个线程修改了一个对象的值,而另外一个线程感知到了变化,而后进行相应的操做,整个java
过程开始于一个线程,而最终执行又是另外一个线程。ide
让消费者线程不断地循环检查变量是否符合预期
线程
// 伪代码 while(value != desire) { Thread.sleep(1000); } doSomething();
利用Object上的wait()和notify()方法进行线程间的交互
code
// A线程 synchronized(对象){ while(条件不知足){ 对象.wait(); } 对应的处理逻辑 } // B线程 synchronized(对象){ 改变条件 对象.notifyAll(); }
轮询方式不只消耗CPU,并且没有及时性.对象
public class NotifyWait { static Object lock = new Object(); static volatile boolean flag = true; public static void main(String[] args) throws InterruptedException { Thread waitThread = new Thread(new Wait(), "WaitThread"); waitThread.start(); TimeUnit.SECONDS.sleep(1); Thread notifyThread = new Thread(new Notify(), "NotifyThread"); notifyThread.start(); } static class Wait implements Runnable { @Override public void run() { synchronized (lock) { while (flag) { try { System.out.println("准备下好好工做了"); System.out.println("WAIT,我快要进入等待队列了,好难受呀"); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("终于能好好工做了"); } } } static class Notify implements Runnable { @Override public void run() { synchronized (lock) { flag = false; System.out.println("NOTIFY,我要脱离等待队列了,好高兴呀"); lock.notifyAll(); } } } }
执行结果队列
准备下好好工做了 WAIT,我快要进入等待队列了,好难受呀 NOTIFY,我要脱离等待队列了,好高兴呀 终于能好好工做了