JAVA生产者与消费者问题( 二 )
原因:wait会释放synchronized锁,多个consume线程或者produce线程wait之后,会不进行检查foodNum 直接变化。。。。。。。所以应该用while (foodNum == MAX_NUM){ System.out.println("box is full,size = " + foodNum); synObj.wait(); } while (foodNum == 0){ System.out.println("box is empty,size = " + foodNum); synObj.wait(); }---------------------------------------分割线-----------------------------------------其实生产者消费者问题的解决方法有很多,这里列举三种1)使用Java的wait() / notify()机制2)使用Java的信号量await() / signal()方法机制3)使用 2)使用Java的信号量await() / signal()方法机制import java.io.IOException;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * @author 作者 E-mail: * @version 创建时间:2015-10-23 下午04:08:39 类说明 */public class AwaitAndSignal{ public static void main(String args) throws IOException { Person person = new Person(); new Thread(new Consumer(person), "消费者一").start(); new Thread(new Consumer(person), "消费者二").start(); new Thread(new Consumer(person), "消费者三").start(); new Thread(new Producer(person), "生产者一").start(); new Thread(new Producer(person), "生产者一").start(); new Thread(new Producer(person), "生产者一").start(); }}class Producer implements Runnable{ private Person person; public Producer(Person person) { this.person = person; } @Override public void run() { for (int i = 0; i \u0026lt; 10; i++) { person.produce(); } }}class Consumer implements Runnable{ private Person person; public Consumer(Person person) { this.person = person; } @Override public void run() { for (int i = 0; i \u0026lt; 10; i++) { person.consume(); } }}class Person{ private int foodNum = 0; private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private final int MAX_NUM = 5; public void produce() { lock.lock(); try { while (foodNum == MAX_NUM) { System.out.println("box is full,size = " + foodNum); condition.await(); } foodNum++; System.out.println("produce success foodNum = " + foodNum); condition.signalAll(); } catch(InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void consume() { lock.lock(); try { while (foodNum == 0) { System.out.println("box is empty,size = " + foodNum); condition.await(); } foodNum--; System.out.println("consume success foodNum = " + foodNum); condition.signalAll(); } catch(InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }}
推荐阅读
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 雪乡烤肠卖15元一根引热议,媒体:定价要以消费者评价为准绳
- 唯品会无搜索模式真的能让大众消费者驻留页面更长时间吗
- 一场家具展,怎样让进去逛的消费者第一眼落在你的产品上
- 本田凌派|丰田三缸机终于来了!消费者会买账吗?
- 趣头条|将消费者放首位,威马起火主动召回态度引好评
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 车市速递|中期改款长和高有变化,新款指南者能否俘获更多消费者的心?
- 蛋糕|网购小蛋糕发霉 消费者索赔千元
- 黑五|
