package com.company; 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<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 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("表示FLAG = false,停止生产"); } public void myConsumer() throws Exception { String data = null; while (FLAG) { data = blockingQueue.poll(2L, TimeUnit.SECONDS); if (data == null || data.equalsIgnoreCase("")) { FLAG = false; System.out.println(Thread.currentThread().getName() + "\t 超过2s没有取到商品,消费退出"); System.out.println(); System.out.println(); System.out.println(); return; } System.out.println(Thread.currentThread().getName() + "\t 消费队列" + data + "成功"); } } public void stop() { this.FLAG = false; } } /** * volatile/CAS/AtomicInteger/BlockingQueue/线程交互/原子引用 */ public class ProdConsumer_BlockingQueueDemo { public static void main(String[] args) { MyResource myResource = new MyResource(new ArrayBlockingQueue<String>(3)); new Thread(() -> { for (int i = 0; i < 5; i++) { try { myResource.myProd(); } catch (Exception e) { e.printStackTrace(); } } }, "Prod").start(); new Thread(() -> { for (int i = 0; i < 5; i++) { try { myResource.myConsumer(); } catch (Exception e) { e.printStackTrace(); } } }, "Conscumer").start(); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("5s后叫停,停止生产销售"); myResource.stop(); } }
输出结果:
Prod 插入队列1成功
Conscumer 消费队列1成功
Prod 插入队列2成功
Conscumer 消费队列2成功
Prod 插入队列3成功
Conscumer 消费队列3成功
Prod 插入队列4成功
Conscumer 消费队列4成功
Prod 插入队列5成功
Conscumer 消费队列5成功
5s后叫停,停止生产销售
表示FLAG = false,停止生产
表示FLAG = false,停止生产
表示FLAG = false,停止生产
表示FLAG = false,停止生产
表示FLAG = false,停止生产
Conscumer 超过2s没有取到商品,消费退出