生产者消费者多线程练习过程中遇到的Bug

发表于:2018-2-27 11:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Mr_小乔    来源:博客园

package threadStudy1;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @ClassName: ProducerConsumer
* @author yudexiao-lhq
* @date 2018-1-12 上午11:15:29
* 对于此模型,应该明确一下几点:
1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3、当消费者发现仓储没产品可消费时候会通知生产者生产。
4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
*/
public class ProducerConsumer {
public static void main(String[] args) {
ProducerConsumer pc = new ProducerConsumer();
Storage s = pc.new Storage();
ExecutorService service = Executors.newCachedThreadPool();
Producer p = pc.new Producer("张三", s);
Producer p2 = pc.new Producer("李四", s);
Consumer c = pc.new Consumer("lily", s);
Consumer c2 = pc.new Consumer("rose", s);
Consumer c3 = pc.new Consumer("tracy", s);
Consumer c4 = pc.new Consumer("dany", s);
service.submit(p);
service.submit(p2);
service.submit(c);
service.submit(c2);
service.submit(c3);
}
/**
* @ClassName: Producer
* @author yudexiao-lhq
* @date 2018-1-12 上午11:16:02
*/
class Producer implements Runnable{
private String name;
private Storage s = null;
public Producer(String name, Storage s) {
this.name = name;
this.s = s;
}
@Override
public void run() {
try {
while(true){
System.out.println(name+"-准备生产");
Product pro = new Product((int)Math.ceil(Math.random()*10));
//Product pro = new Product((int)Math.ceil(Math.random()*1000000000));
System.out.println("===========已成功生产:"+pro.toString());
s.add(pro);
System.out.println("===========已成功入库:"+pro.toString());
Thread.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable{
private String name;
private Storage s = null;
public Consumer(String name, Storage s) {
this.name = name;
this.s = s;
}
public void run() {
try {
while(true){
System.out.println("start to consume...");
Product pro = s.remove();
System.out.println(name+"===========已消费产品:"+pro.toString());
Thread.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* @ClassName: Storage
* @author yudexiao-lhq
* @date 2018-1-12 上午11:16:02
*/
public class Storage {
BlockingQueue<Product> queue = new ArrayBlockingQueue<Product>(10);
//入库
public void add(Product p) throws InterruptedException {
//queue.put(p);
queue.put(p);
//System.out.println("当前库存;"+queue.size());
}
//出库
public Product remove() throws InterruptedException {
return queue.take();
}
}
/**
* @ClassName: Product
* @author yudexiao-lhq
* @date 2018-1-12 上午11:16:02
*/
public class Product {
private int id;
public Product (int id){
this.id = id;
}
@Override
public String toString() {
return "["+id+"]号产品";
}
}
}
  Product pro = new Product((int)Math.ceil(Math.random()*10));中如果随机数取值太小,会出现产品号重复的问题,所以说不要再低端问题上掉进坑中,故而使用Product pro = new Product((int)Math.ceil(Math.random()*1000000000));取而代之。
  bug截图复现如上图。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号