package com.demo.blockingqueue;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
class MyData //资源类
{
private volatile boolean FLAG=true;
private AtomicInteger atomicInteger=new AtomicInteger();
BlockingQueue<String> blockingQueue=null;
public MyData(BlockingQueue<String> blockingQueue) {
this.blockingQueue = blockingQueue;
System.out.println(Thread.currentThread().getName());
}
public void product() throws Exception{
String data = null;
Boolean resultValue;
while (FLAG){
data=atomicInteger.incrementAndGet()+"";
resultValue = blockingQueue.offer(data + "", 2L, TimeUnit.SECONDS);
if(resultValue){
System.out.println(Thread.currentThread().getName()+"----插入队列"+data+"成功");
}else {
System.out.println(Thread.currentThread().getName()+"插入队列"+data+"失败");
}
TimeUnit.MILLISECONDS.sleep(100);
}
System.out.println(Thread.currentThread().getName()+"大老板叫停了,表示FLAG=false 生产动作结束");
}
public void consumer() throws Exception{
String result = null;
while (FLAG){
result=blockingQueue.poll(2L,TimeUnit.SECONDS);
if(result==null||result.equalsIgnoreCase("")){
FLAG=false;
System.out.println(Thread.currentThread().getName()+"超过2秒没有拿到蛋糕消费者退出");
System.out.println();
System.out.println();
return;
}
System.out.println(Thread.currentThread().getName()+"*******消费队列"+result+"成功");
}
}
public void stop(){
this.FLAG=false;
}
}
public class ProducterAndConsumer {
public static void main(String[] args) {
MyData myData=new MyData(new ArrayBlockingQueue<String>(10));
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"生产线程启动");
try {
myData.product();
} catch (Exception e) {
e.printStackTrace();
}
},"product").start();
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"消费者线程启动");
try {
myData.consumer();
} 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("5秒钟到,大老板main线程 叫停");
myData.stop();
}
}