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;
private AtomicInteger atomicInteger = new AtomicInteger();
BlockingQueue blockingQueue =null;
public MyResource(BlockingQueue blockingQueue) {
this.blockingQueue = blockingQueue;
}
public void myProd() 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生产结束");
}
public void myConsumer() throws Exception{
String result =null;
while (FLAG){
result = (String) blockingQueue.poll(2L, TimeUnit.SECONDS);
if(null ==result || result.equalsIgnoreCase("")){
FLAG = false;
System.out.println(Thread.currentThread().getName()+"\t 超过2s没有取到,退出");
System.out.println();
System.out.println();
return;
}
System.out.println(Thread.currentThread().getName()+"\t 消费队列"+result+"成功");
}
}
public void stop()throws Exception{
this.FLAG=false;
}
}
public class ProdConsumer_BlockingQueueDemo {
public static void main(String[] args) throws Exception {
MyResource myResource = new MyResource(new ArrayBlockingQueue<>(10));
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 生产启动");
try{
myResource.myProd();
}catch(Exception e){
e.printStackTrace();
}finally{
}
},"Prod").start();
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 消费启动");
try{
myResource.myConsumer();
}catch(Exception e){
e.printStackTrace();
}finally{
}
},"Consumer").start();
try{
TimeUnit.SECONDS.sleep(5);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println();
System.out.println();
System.out.println();
myResource.stop();
System.out.println("5s到,线程叫停,活动结束");
}
}