生产者消费者问题 阻塞队列版
package com.zyk;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
class MySource{
private volatile boolean flag=true;
private AtomicInteger atomicInteger=new AtomicInteger();
BlockingQueue blockingQueue=null;
public MySource(BlockingQueue blockingQueue){
this.blockingQueue=blockingQueue;
System.out.println(blockingQueue.getClass().getName());
}
public void myProduce()throws Exception{
String data=null;
boolean resultValue;
while (flag){
data=atomicInteger.incrementAndGet()+"";
resultValue=blockingQueue.offer(data,2, TimeUnit.SECONDS);
if (resultValue) {
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()+"被叫停");
}
public void myConsumer()throws Exception{
String result=null;
while(flag){
result= (String) blockingQueue.poll(2,TimeUnit.SECONDS);
if(null==result||result.equalsIgnoreCase("")){
flag=false;
System.out.println(Thread.currentThread().getName()+"超过2秒没有取到 消费退出");
return;
}
System.out.println(Thread.currentThread().getName()+"消费成功"+result);
}
}
public void stop(){
this.flag=false;
}
}
public class Product_ConsumerDemo3 {
public static void main(String[] args) {
MySource mySource=new MySource(new ArrayBlockingQueue(3));
new Thread(()->{
System.out.println("生产线程启动");
try {
mySource.myProduce();
} catch (Exception e) {
e.printStackTrace();
}
},"生产线程").start();
new Thread(()->{
System.out.println("消费线程启动");
try {
mySource.myConsumer();
} catch (Exception e) {
e.printStackTrace();
}
},"消费线程").start();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
System.out.println();
System.out.println("5秒之后 退出所有活动");
mySource.stop();
}
}