1. 程式人生 > >基於阻塞佇列實現的簡單生產者-消費者模式

基於阻塞佇列實現的簡單生產者-消費者模式

生產者生成資料放入到佇列中,供消費者消費;

消費者從佇列中獲取資料,進行消費。

下面是一個簡單的生產者-消費者模式程式碼例項:

生產者執行緒每隔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
 */
public
class 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