生产者与消费者
/* * 生产者与消费者 */ public class Test4 { public static void main(String[] args) { Clerk c = new Clerk(); //生产者,使用匿名内部类 new Thread(new Runnable() { @Override public void run() { synchronized(c) { // 同步锁代码块 while(true) { //无限循环表示无限生产 if(c.productNum == 0) {//商品产品数为零,开始生产 System.out.println("产品数为0,开始生产"); while(c.productNum < 4) { c.productNum ++; System.out.println("库存:" + c.productNum); } System.out.println("产品数为 :" + c.productNum + ", 结束生产"); c.notify();//唤醒消费者 }else { //有产品不生产 try { c.wait(); //生产者线程等待 } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } } } }, "生产者").start();; new Thread(new Runnable() { @Override public void run() { synchronized(c) { // 同步锁代码块 while(true) { //无限循环表示无限消费次数 if(c.productNum == 4) {//商品产品数为满库存(4),开始消费 System.out.println("产品数为4,开始消费"); while(c.productNum > 0) { c.productNum --; System.out.println("库存:" + c.productNum); } System.out.println("产品数为 :" + c.productNum + ", 结束消费"); c.notify();//唤醒生产者 }else { try { c.wait(); //消费者线程等待 } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } } } }, "消费者").start(); } } class Clerk{ public static int productNum = 0; }
- wait():该方法用来将当前线程置入休眠状态,直到在其他线程调用此对象的notify()方法或notifyAll()方法将其唤醒。
- 调用 notify() 方法解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。
- notifyAll() 也可起到和notify()类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。
- wait()和notify()必须成对出现。
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!