併發學習計劃-ArrayBlockingQueue和LinkedBlockingQueue02
兩個東西,看名字就知道是先進先出的佇列,不過這個blocking是什麼意思,很顯然這是“塊”的意思,也就是這是一個阻塞佇列。
舉個生活中的例子,籃子裡面最多隻能放5個蘋果,一個人往籃子裡面放,一個人往籃子裡面拿,假設籃子的容量滿了,就要等一個人拿出來之後才能放,籃子空了也要等一個人把蘋果放進去才能拿。
上面的例子有點消費生產者模式的意思。
跟今天我們要說的BlockingQueue有啥關係呢,這兩個BlockingQueue就好像這個籃子一樣。滿了就等有容量的時候再裝,空了就等有東西的時候再拿。
唯一的區別就是,ArrayBlockingQueue的內部是陣列,LinkedBlockingQueue的內部是連結串列。
拿ArrayBlockingQueue舉例子。
如果寫出了下面的程式碼,就完了。
BlockingQueue<String> a = new ArrayBlockingQueue<String>(5);
for (int i = 0; i < 10; i++) {
try {
a.put(i + "");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("111");
因為永遠執行不到最後面的列印語句,會永遠卡在那裡,容量只有5,但是要放10個東西。
我們可以這樣做:
BlockingQueue<String> a = new ArrayBlockingQueue<String>(5);
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
a.put(i + "");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
String str;
try {
while ((str = a.take()) != null) {
System.out.println("take : " + str);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
寫兩個執行緒,一個放一個拿,這樣就不會阻塞了,阻塞的好處就是,可以在一定程度上節約空間。
我們可以在這些佇列中存放執行緒哦,假設有10個任務,5個執行緒,把任務丟進去,讓5個執行緒去執行,哪個執行緒執行完了就去執行下一個任務,任務也可以用佇列儲存起來,這樣也不會弄混。
good idea!
相關文章
- 併發容器之ArrayBlockingQueue和LinkedBlockingQueue實現原理詳解BloC
- java併發面試常識之ArrayBlockingQueueJava面試BloC
- Java併發包原始碼學習系列:阻塞佇列實現之ArrayBlockingQueue原始碼解析Java原始碼佇列BloC
- java併發程式設計工具類JUC第二篇:ArrayBlockingQueueJava程式設計BloC
- 學習Rust 併發程式設計Rust程式設計
- 學習計劃:
- 《java學習二》併發程式設計Java程式設計
- 【Java併發程式設計】一、為什麼需要學習併發程式設計?Java程式設計
- Java 併發程式設計學習總結Java程式設計
- 執行緒基礎(二十一)-併發容器-ArrayBlockingQueue(上)執行緒BloC
- 200911月學習計劃
- Python-學習計劃Python
- 學習計劃的安排
- Doug Lea併發設計模式(JUC學習前奏)設計模式
- 學習 Go併發模型Go模型
- iOS入門學習計劃iOS
- 微服務學習計劃——SpringCloud微服務SpringGCCloud
- 演算法學習計劃演算法
- 併發程式設計原理學習:synchronized關鍵字程式設計synchronized
- 通過 SingleFlight 模式學習 Go 併發程式設計模式Go程式設計
- 簡明高效的 Java 併發程式設計學習指南Java程式設計
- 併發程式設計基礎底層原理學習(二)程式設計
- 併發程式設計基礎底層原理學習(四)程式設計
- 併發程式設計基礎底層原理學習(一)程式設計
- 360前端星計劃學習-html前端HTML
- 人工智慧之路學習計劃人工智慧
- 多執行緒高併發程式設計(12) -- 阻塞演算法實現ArrayBlockingQueue原始碼分析(1)執行緒程式設計演算法BloC原始碼
- 《筆記》之學習高併發筆記
- (一)Java併發學習筆記Java筆記
- JAVA 學習併發筆記(一)Java筆記
- JUC併發程式設計學習(五)集合類不安全程式設計
- JUC併發程式設計學習筆記(六)Callable(簡單)程式設計筆記
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- 學習之路 / goroutine 併發協程池設計及實現Go
- MongoDb學習之Explain執行計劃MongoDBAI
- 大資料學習入門規劃?和學習路線大資料
- 《java併發程式設計的藝術》併發容器和框架Java程式設計框架
- Android併發學習之阻塞佇列Android佇列