阻塞隊列 BlockingQueue

java.util.concurrent.BlockingQueue 接口表明了線程安全的隊列。
java

BlockingQueue的使用

一個BlockingQueue的典型使用是一個線程不斷生產對象往隊列裏放,另外一個線程往隊列裏取對象進行消費。
安全

生產線程會保持一致產生新的對象而且插入到隊列中,直到隊列到達了它的存儲上限,生產線程再往隊列插入時會發現阻塞,而且一直保持阻塞直到消費線程從隊列中取出一個對象。this

消費線程會保持從隊列中取出對象而且進行處理,若是消費線程試圖從一個空的隊列中取出對象,那麼消費線程將會阻塞直到生產線程往隊列中放入了新的對象。spa

BlockingQueue的方法

BlockingQueue由4中不一樣的方法來添加,刪除和檢測。每組方法有不一樣的特色泳衣知足不能當即執行響應請求的操做。
線程

操做 拋出異常 返回操做結果 阻塞 超時
插入 add(o) offer(o) put(o) offer(o,timeout,timeunit)
刪除 remove(o) poll(o) take(o) poll(timeout,timeunit)
檢測element(o) peek(o)


1.拋出異常:若是對應方法沒有當即執行則拋出異常。code

2.返回操做結果:若是對應方法當即執行返回true,不然則返回false(超出隊列容量)。對象

3.阻塞:若是對應方法沒法當即執行,則將阻塞等待直到方法完成。接口

4.超時:若是對應方法沒法當即執行,則會一直等待但不超過給定的超時範圍,返回相應的結果。隊列

BlockingQueue的實現類

ArrayBlockingQueue
element

DelayQueue

LinkedBlockingDeque

PriorityBlockingQueue

SynchronousQueue

BlockingQueue的示例

// 文章開頭生產與消費的示例
public class BlockingQueueExample {

    public static void main(String[] args) throws Exception {

        BlockingQueue queue = new ArrayBlockingQueue(1024);

        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);

        new Thread(producer).start();
        new Thread(consumer).start();

        Thread.sleep(4000);
    }
}

// 生產者
public class Producer implements Runnable{

    protected BlockingQueue queue = null;

    public Producer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            queue.put("1");
            Thread.sleep(1000);
            queue.put("2");
            Thread.sleep(1000);
            queue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

// 消費者
public class Consumer implements Runnable{

    protected BlockingQueue queue = null;

    public Consumer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索