JavaConcurrentLinkedQueue佇列執行緒安全操作
Java ConcurrentLinkedQueue佇列執行緒安全操作
程式碼示例:
package async;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
*
* 執行緒安全佇列Queue實現計算科學古老的執行緒同步問題:生產者-消費者模型
*
* @author phil
*
*/
public class Demo {
public static void main(String[] args) {
// 執行緒操作安全佇列,裝載資料
Queue<String> queue = new ConcurrentLinkedQueue<String>();
// 消費者執行緒:不斷的消費佇列中的資料
// 該執行緒不停的從佇列中取出佇列中最頭部的資料
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
// 從佇列的頭部取出並刪除該條資料
String s = queue.poll();
if (s != null) {
System.out.println(System.currentTimeMillis() + "取出資料:" + s);
}
}
}
}).start();
// 生產者執行緒A:不斷的生產單個資料並裝入佇列中
// 該執行緒模擬不停的在佇列中裝入一個資料
new Thread(new Runnable() {
private int count = 0;
private int number = 0;
@Override
public void run() {
while (true) {
number = count++;
System.out.println("裝載資料:" + number);
queue.add(String.valueOf(number));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
// 生產者執行緒B:不斷的生產批量資料並裝入佇列中
// 該執行緒模擬不停的在佇列中裝入一批資料
new Thread(new Runnable() {
private List<String> lists = new ArrayList<String>();
private int count = 0;
@Override
public void run() {
while (true) {
// 一批資料的數量,不定長
count = (int) (Math.random() * 5);
for (int i = 0; i < count; i++) {
lists.add("批量資料-" + i + "," + Math.random());
}
queue.addAll(lists);
lists.clear();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
程式碼執行結果:
裝載資料:0
1490417519703取出資料:0
1490417519705取出資料:批量資料-0,0.9045746291285363
裝載資料:1
1490417520703取出資料:1
1490417520705取出資料:批量資料-0,0.9378737341890285
1490417520705取出資料:批量資料-1,0.5609780480099475
1490417520705取出資料:批量資料-2,0.27383078038481046
1490417520705取出資料:批量資料-3,0.6824300990854635
裝載資料:2
1490417521704取出資料:2
1490417521706取出資料:批量資料-0,0.23916865770830298
裝載資料:3
1490417522704取出資料:3
1490417522706取出資料:批量資料-0,0.4169859285695523
1490417522706取出資料:批量資料-1,0.6667611178989155
1490417522706取出資料:批量資料-2,0.9026516620769446
1490417522706取出資料:批量資料-3,0.3491566771349188
裝載資料:4
1490417523705取出資料:4
1490417523707取出資料:批量資料-0,0.5634243124726268
1490417523707取出資料:批量資料-1,0.4021826644433847
裝載資料:5
1490417524705取出資料:5
1490417524707取出資料:批量資料-0,0.9431588628811881
1490417524707取出資料:批量資料-1,0.8762171226841987
1490417524707取出資料:批量資料-2,0.0470837112538508
裝載資料:6
1490417525705取出資料:6
1490417525707取出資料:批量資料-0,0.31099249499423265
1490417525707取出資料:批量資料-1,0.7660770869693369
1490417525707取出資料:批量資料-2,0.3209338524956993
1490417525707取出資料:批量資料-3,0.2525376039263991
裝載資料:7
1490417526706取出資料:7
1490417526708取出資料:批量資料-0,0.6369286896471094
致謝:
馮貴兵對本文有重大貢獻!
附錄:
1,《Java同步機制:synchronized,wait,notify》連結地址:http://blog.csdn.net/zhangphil/article/details/43800949
2,《Java執行緒同步:生產者-消費者 模型(程式碼示例)》連結地址:http://blog.csdn.net/zhangphil/article/details/43800967
相關文章
- Python實現執行緒安全佇列Python執行緒佇列
- 列表與佇列——談談執行緒安全佇列執行緒
- 執行緒安全佇列(使用互斥鎖進行實現)執行緒佇列
- 主佇列&主執行緒佇列執行緒
- C#資料結構-執行緒安全佇列C#資料結構執行緒佇列
- C++自用小輪子——執行緒安全佇列C++執行緒佇列
- java多執行緒:執行緒池原理、阻塞佇列Java執行緒佇列
- 執行緒安全操作HashMap執行緒HashMap
- iOS 多執行緒--GCD 序列佇列、併發佇列以及同步執行、非同步執行iOS執行緒GC佇列非同步
- java執行緒池-工作佇列workQueueJava執行緒佇列
- 多執行緒學習-Disruptor佇列執行緒佇列
- iOS-佇列.執行緒.任務iOS佇列執行緒
- 執行緒池與工作佇列(轉)執行緒佇列
- Swift 執行緒安全陣列Swift執行緒陣列
- 最全java多執行緒總結3——瞭解阻塞佇列和執行緒安全集合不Java執行緒佇列
- C#使用執行緒安全佇列ConcurrentQueue處理資料C#執行緒佇列
- 執行緒池的阻塞佇列的理解執行緒佇列
- java多執行緒:java佇列詳解Java執行緒佇列
- iOS執行緒、同步非同步、序列並行佇列iOS執行緒非同步並行佇列
- 執行緒池中的最大執行緒數、核心執行緒數和佇列大小的合理設定執行緒佇列
- java-執行緒池佇列飽和策略Java執行緒佇列
- Java執行緒(篇外篇):阻塞佇列BlockingQueueJava執行緒佇列BloC
- 任務與佇列 iOS之多執行緒GCD(一)佇列iOS執行緒GC
- 探討阻塞佇列和執行緒池原始碼佇列執行緒原始碼
- Java幾種執行緒池及任務佇列Java執行緒佇列
- Java BlockingQueue 阻塞佇列[用於多執行緒]JavaBloC佇列執行緒
- C++ 多執行緒框架(3):訊息佇列C++執行緒框架佇列
- shell佇列實現執行緒併發控制(轉)佇列執行緒
- Java阻塞佇列執行緒集控制的實現Java佇列執行緒
- 深入淺出Java多執行緒(十三):阻塞佇列Java執行緒佇列
- 證明執行緒池ThreadPoolExecutor的核心執行緒數,最大執行緒數,佇列長度的關係執行緒thread佇列
- 執行緒操作執行緒
- 執行緒3--執行緒安全執行緒
- 執行緒安全和執行緒不安全理解執行緒
- 多執行緒,執行緒類三種方式,執行緒排程,執行緒同步,死鎖,執行緒間的通訊,阻塞佇列,wait和sleep區別?執行緒佇列AI
- 踩坑 Spring Cloud Hystrix 執行緒池佇列配置SpringCloud執行緒佇列
- java多執行緒8:阻塞佇列與Fork/Join框架Java執行緒佇列框架
- 原始碼剖析ThreadPoolExecutor執行緒池及阻塞佇列原始碼thread執行緒佇列