項目中常用的java並發操作
一、java8新特性java並發流操作(結合納姆達表達式)
List<String> list = new ArrayList<>();
list..stream().parallel().forEach(list1 ->{
// 調用方法 method
});
注:其中list1為list一個子集。然后通過java流(steam)操作並發(parellel),同時開啟多個線程去執行方法(method);
所以當一個線程執行完成之后會繼續執行集合中另外的子集,直到list循環結束。
二、采用阻塞隊列的形式
1、List<Qcbatch> qcBatchList = new ArrayList<>();
注:QcBatch 為一個對象,此處為一個示例,然后在qcBatchList 集合中放入自己的元素
2、// 創建阻塞隊列跑批
ConcurrentLinkedQueue<QcBatch> queue = new ConcurrentLinkedQueue<>(); // 線程同步的隊列
queue.addAll(qcBatchList );
int count = 10; // 此處為設置線程數位10
final CountDownLatch countDownLatch = new CountDownLatch(count); //將線程放入計數器中
注:CountDownLatch是Java1.5之后引入的Java並發工具類,放在java.util.concurrent包下,CountDownLatch能夠使一個或多個線程等待其他線程完成 各自的工作后再執行
3.循環操作線程
for (int i = 0; i < count; i++) {
new Thread(() -> {
CheckResult<QcBatch> t;
try {
// queue.poll 從隊列中刪除第一個元素,知道為空,會返回null對象(與remove()有些不同)
while ((t = queue.poll()) != null) {
// 此處調用自己的業務邏輯
}
} finally {
countDownLatch.countDown(); // 每調用一次這個方法,在構造函數中初始化的count值就減1
//所以當N個線程都調 用了這個方法,count的值等於0,然后主線程就能通過await()方法,恢復執行自己的任務。
}
}).start();
}
countDownLatch.await(); // 等待所有跑批線程執行結束
兩種方式比較:第一種方式是每個線程各自執行,任務會有先后順序;
第二種方式是等時執行,在效果上是同一時間完成10個任務;
所以我們在實際項目中要根據不同的情況來選擇哪種方式
