|
public synchronized void produceGoods(){ |
|
try { |
|
Goods goods = new Goods(); |
|
boolean flag = queue.offer(goods, 3, TimeUnit.SECONDS); |
|
if(flag){ |
|
count++ ; |
|
goods.setId(count); |
|
goods.setName("goods"+count); |
|
|
|
System.out.println("生产成功:商品编号:"+goods.getId()+",名字:"+goods.getName() +",库存:"+ queue.size() ); |
|
Thread.sleep((long)(Math.random()*10)); |
|
|
|
notifyAll();//有新商品了,通知消费者消费... |
|
|
|
}else{ |
|
System.out.println("生产商品失败..."); |
|
} |
|
|
|
if(queue.size() >= 100){ |
|
System.out.println("库存已满,等待消费。。。"); |
|
wait(); |
|
} |
|
|
|
|
|
}catch(Exception e){ |
|
e.printStackTrace(); |
|
} |
|
|
|
} |
如果不提前判断库存量(队列长度),暂停生产者线程,有可能会出现库存量超过 100 的情况。
由于生产者线程有两个,而 wait() 方法只会阻塞当前生产者线程,假如另一个生产者线程因为调度得到了CPU资源,那么首先会正常进行商品的生产,然后才会暂停这个生产者线程,从实际的情况来看已经超过了库存量 100
JavaCore/sources/ThreadProject/src/producerandconsumer2/GoodsStock.java
Lines 24 to 52 in 4c9574b
如果不提前判断库存量(队列长度),暂停生产者线程,有可能会出现库存量超过 100 的情况。
由于生产者线程有两个,而 wait() 方法只会阻塞当前生产者线程,假如另一个生产者线程因为调度得到了CPU资源,那么首先会正常进行商品的生产,然后才会暂停这个生产者线程,从实际的情况来看已经超过了库存量 100