码迷,mamicode.com
首页 > 编程语言 > 详细

线程通信之生产者消费者阻塞队列版

时间:2020-01-06 00:36:19      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:data   private   top   block   sys   incr   rup   cond   超过   


class MyResource {
private volatile boolean FLAG = true; //默认开启,进行生产+消费
private AtomicInteger atomicInteger = new AtomicInteger();

BlockingQueue<String> blockingQueue = null;

public MyResource(BlockingQueue<String> blockingQueue) {
this.blockingQueue = blockingQueue;
}

public void myProduct() throws Exception {
String data = null;
boolean retValue;
while (FLAG) {
data = atomicInteger.incrementAndGet()+"";
retValue = blockingQueue.offer(data,2L, TimeUnit.SECONDS);
if(retValue) {
System.out.println(Thread.currentThread().getName() +"\t 插入队列" + data +"成功");
} else {
System.out.println(Thread.currentThread().getName() +"\t 插入队列" + data +"失败");
}
TimeUnit.SECONDS.sleep(1);
}
System.out.println(Thread.currentThread().getName()+"\t 大老板叫停了,表示FLAG = false,生产动作结束");
}

public void myConsumer() throws Exception {
String result = null;
while(FLAG) {
result = blockingQueue.poll(2L,TimeUnit.SECONDS);
if(null == result || result.equalsIgnoreCase("")) {
FLAG = false;
System.out.println(Thread.currentThread().getName()+"\t超过2秒钟没有取到蛋糕,消费退出");
System.out.println();
System.out.println();
return ;
}
System.out.println(Thread.currentThread().getName()+"\t消费队列"+result +"成功");

}
}

public void stop() {
this.FLAG = false;
}
}

public class ProductConsumer_BlockQueueDemo {
public static void main(String[] args){
MyResource myResource = new MyResource(new ArrayBlockingQueue<String>(10));
new Thread(() ->{
System.out.println(Thread.currentThread().getName()+"\t生产线程启动");
try {
myResource.myProduct();
} catch (Exception e) {
e.printStackTrace();
}

},"product").start();

new Thread(() ->{
System.out.println(Thread.currentThread().getName()+"\t消费线程启动");
try {
myResource.myConsumer();
} catch (Exception e) {
e.printStackTrace();
}

},"consumer").start();
//暂停一会儿线程
try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) { e.printStackTrace(); }
System.out.println();
System.out.println();
System.out.println();
System.out.println("5秒时间到,大老板main线程叫停,活动结束");
myResource.stop();
}
}

运行结果见下图:

技术图片

线程通信之生产者消费者阻塞队列版

标签:data   private   top   block   sys   incr   rup   cond   超过   

原文地址:https://www.cnblogs.com/liuyi13535496566/p/12154242.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!