一 . 概念
我们使用多个线程的时候,我们需要线程运行之间按照一定的顺序运行下去,这个就需要线程之间的通信.
二 .例子
我们使用经典的生产者和消费者模式演示一下.
public class ProductAndConsume { private static Object lock = new Object(); private volatile static int count = 0; private static volatile boolean flag = false; public static void product() { synchronized (lock) { try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } if (!flag) { System.out.println("我生产了第" + (++count) + "个产品"); try { //放入等待池中 flag = true ; lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void consume() { synchronized (lock) { try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } if (flag) { // 有产品 System.out.println("我消费了第" + count + "个产品"); flag = false; lock.notify(); } } } public static void main(String[] args) { new Thread("product") { @Override public void run() { for(;;) product(); }; }.start(); new Thread("consume") { @Override public void run() { for(;;) consume(); }; }.start(); }}
我们创建了两个线程,一个生产产品,另外一个线程消费产品.
我们使用了wait()方法和notify()方法发送信号量,实现线程之间的同步.
三 .分析
[1]首先需要说明的就是我们的wait和notify都需要在同步代码块(同步方法之中运行).
[2]wait()方法的含义是:
放弃当前持有的锁,,进入到锁池中,等待被唤醒.
[3]notify()方法的含义是:
在当前的锁池中唤醒一个线程.