package com.atgu;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
class MyResource{
private volatile boolean FLAG=true;
AtomicInteger atomicInteger=new AtomicInteger();
BlockingQueue blockingQueue=null;
public MyResource(BlockingQueue blockingQueue) {
this.blockingQueue = blockingQueue;
System.out.println("传入了---"+blockingQueue.getClass().getName());
}
public void myProducer() throws Exception{
String date=null;
boolean retVal;
while (FLAG){
date=atomicInteger.incrementAndGet()+"";
retVal=blockingQueue.offer(date,2L,TimeUnit.SECONDS);
if (retVal)
{
System.out.println(Thread.currentThread().getName()+date+" 插入成功");
}
else
{
System.out.println(Thread.currentThread().getName()+date+" 插入失败");
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "\t 停止生产,表示FLAG=false,生产结束");
}
public void myConsumer() throws Exception{
String result=null;
while (FLAG){
result=blockingQueue.poll(2,TimeUnit.SECONDS);
if (result!=null||result!="")
{
System.out.println(Thread.currentThread().getName()+result+" 取出成功");
}
else
{
FLAG=false;
System.out.println(Thread.currentThread().getName()+"\t消费失败,队列中已为空,退出");
return;
}
}
}
public void stop(){
FLAG=false;
}
}
public class ProducerConsumerWithBlockingQueueDemo {
public static void main(String[] args) {
MyResource myResource = new MyResource(new ArrayBlockingQueue(10));
new Thread(()->{
System.out.println(Thread.currentThread().getName() + "\t 生产线程启动\n\n");
try {
myResource.myProducer();
} catch (Exception e) {
e.printStackTrace();
}
},"producer").start();
new Thread(()->{
System.out.println(Thread.currentThread().getName() + "\t 消费线程启动\n\n");
try {
myResource.myConsumer();
} catch (Exception e) {
e.printStackTrace();
}
},"consumer").start();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("\n\n5秒中后,生产和消费线程停止,线程结束");
myResource.stop();
}
}