java執行緒學習(九):阻塞佇列BlockingQueue講解
阿新 • • 發佈:2019-01-09
上一章中學到了執行緒池的詳細使用以及核心執行緒池的部分原始碼,其中就包含有BlockingQueue
的資訊,那麼到底BlockingQueue
是什麼呢,有什麼用呢,本章就是學這個的。
Blocking翻譯過來為’阻塞’,Queue就是佇列的意思,那麼BlockingQueue就是阻塞隊列了,首先我們要理解,什麼是阻塞佇列,什麼又是非阻塞佇列呢?
1.阻塞佇列和非阻塞佇列
1.1 區別
阻塞佇列可以阻塞,非阻塞佇列不能阻塞,只能使用佇列wait(),notify()進行佇列訊息傳送。而阻塞隊列當佇列裡面沒有值時,會阻塞直到有值輸入。輸入也一樣,當佇列滿的時候,會阻塞,直到佇列不為空。看完了還是不太懂,對麼,那就舉個例子:
1.2 例子
阻塞佇列在新增元素時:
private void consume() {
while(true){
try {
queue.take();
System.out.println("從佇列取走一個元素,佇列剩餘"+
queue.size()+"個元素");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
非阻塞佇列在新增元素時:
private void consume() {
while(true){
synchronized (queue) {
while(queue.size() == 0){
try {
System. out.println("佇列空,等待資料");
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
queue.notify();
}
}
queue.poll(); //每次移走隊首元素
queue.notify();
System.out.println("從佇列取走一個元素,佇列剩餘"+
queue.size()+"個元素");
}
}
可以看到阻塞佇列不需要synchronized,或者呼叫wait(),notify()來進行佇列互動。
正在更新。。