基於阻塞佇列實現的簡單生產者-消費者模式
阿新 • • 發佈:2019-01-01
生產者:生成資料放入到佇列中,供消費者消費;
消費者:從佇列中獲取資料,進行消費。
下面是一個簡單的生產者-消費者模式程式碼例項:
生產者執行緒每隔3秒生產一個隨機數並放入到阻塞佇列中,消費者執行緒不斷得去佇列中獲取元素進行消費。
1、生產者程式碼
/** * @Description: 生產者 * @author: Alan * @Date: 2019/1/1 21:46 */ public class Producer implements Runnable { private final BlockingQueue queue; public Producer(BlockingQueue q) {this.queue = q; } @Override public void run() { try { while (true) { //將生產的物件放入阻塞佇列中,供消費者消費 queue.put(produce()); Thread.sleep(3000); } } catch (Exception e) { e.printStackTrace(); } }/** * 生產方法 * * @return */ public Object produce() { double num = Math.random(); System.out.println(Thread.currentThread().getName() + "生產了隨機數 " + num); return num; } }
2、消費者程式碼
/** * @Description: 消費者 * @author: Alan * @Date: 2019/1/1 21:46 */ publicclass Consumer implements Runnable { private final BlockingQueue queue; public Consumer(BlockingQueue q) { this.queue = q; } @Override public void run() { try { while (true) { //從阻塞佇列中取出元素並進行消費 consume(queue.take()); } } catch (Exception e) { e.printStackTrace(); } } /** * 消費方法 * * @param o */ public void consume(Object o) { System.out.println(Thread.currentThread().getName() + "消費者消費了" + o.toString()); } }
3、main方法
/** * @Description: 使用BlockingQueue實現的簡單生產者-消費者模式 * @author: Alan * @Date: 2019/1/1 21:46 */ public class Main { public static void main(String[] args) { //阻塞佇列 BlockingQueue queue = new LinkedBlockingQueue(); //例項化生產者 Producer producer = new Producer(queue); //例項化消費者1 Consumer consumer1 = new Consumer(queue); //例項化消費者2 Consumer consumer2 = new Consumer(queue); //啟動生產者執行緒 new Thread(producer).start(); //啟動消費者1執行緒 new Thread(consumer1).start(); //啟動消費者2執行緒 new Thread(consumer2).start(); } }
執行結果
Thread-0生產了隨機數 0.4148294452924416 Thread-1消費者消費了0.4148294452924416 Thread-0生產了隨機數 0.2548693317829043 Thread-2消費者消費了0.2548693317829043 Thread-0生產了隨機數 0.7716023641452534 Thread-1消費者消費了0.7716023641452534 Thread-0生產了隨機數 0.918439707362971 Thread-2消費者消費了0.918439707362971 Thread-0生產了隨機數 0.8355631426120482 Thread-1消費者消費了0.8355631426120482