import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 描述:生产者消费者 3.0 阻塞队列 版
*
* @author 小纸人
* @create 2019-07-31 22:05
* <p>
* 使用的技术 :
* volatile、CAS、atomicInteger、BlockQueue、线程交互、原子引用
*/
class MyResource {
private volatile boolean FLAG = true; //默认开启,生产 + 消费
private AtomicInteger atomicInteger = new AtomicInteger();
BlockingQueue<String> blockingQueue = null;
public MyResource(BlockingQueue<String> blockingQueue) {
this.blockingQueue = blockingQueue;
System.out.println("使用了:" + blockingQueue.getClass().getName());
}
public void myProd() throws Exception {
String data = null;
boolean returnVal = false;
while (FLAG) {
data = atomicInteger.incrementAndGet() + "";
returnVal = blockingQueue.offer(data, 2L, TimeUnit.SECONDS);
if (returnVal) {
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("")) {
System.out.println(Thread.currentThread().getName() + "\t 超过2秒没有消费。消费退出");
return;
}
System.out.println(Thread.currentThread().getName() + "\t 消费" + result + "成功");
}
}
public void stop() {
this.FLAG = false;
}
}
public class Version3_0 {
public static void main(String[] args) {
MyResource myResource = new MyResource(new ArrayBlockingQueue<>(10));
new Thread(() -> {
System.out.println("生产者线程启动");
try {
myResource.myProd();
} catch (Exception e) {
e.printStackTrace();
}
}, "Prod").start();
new Thread(() -> {
System.out.println("消费者线程启动");
try {
myResource.myConsumer();
} catch (Exception e) {
e.printStackTrace();
}
}, "Consumer").start();
//暂停一会线程
try { TimeUnit.SECONDS.sleep(5); } catch (Exception e) { e.printStackTrace(); }
System.out.println();
System.out.println("5秒钟时间到!活动结束");
myResource.stop();
}
}