Java多執行緒之併發工具類
一、總論:在JDK中提供了幾種併發工具類
1)CountDownLatch(同步倒數計數器:等待多執行緒(或者多步驟)完成)
2)CyclicBarrier(迴圈屏障:同步屏障)
3)Semaphore(訊號量:控制併發程序數)
主要參考資料:java併發程式設計的藝術、Java併發——同步工具類
二、CountDownLatch(同步倒數計數器)–不僅僅用於多執行緒
1.作用:允許一個或多個執行緒等待其他執行緒完成操作。
CountDownLatch的建構函式接受一個int類的引數作為計數器,如果你想等待N個節點完成,那這裡就傳入N.
2.countDown方法:當我們呼叫CountDownLatch的countDown方法時,N就會減1;CountdownLatch的await方法就會阻塞當前執行緒,直到N變成零。
3.使用說明:由於CountDown可以用在任何地方,所以這裡說的N個點,可以是N個執行緒,也可以說是N個步驟。
4.await方法:明確一點,countDown方法是目標執行緒或步驟呼叫的,用來通知監控執行緒自己的任務完成;await方法是當前執行緒或者主幹步驟呼叫的,用來監控整個執行緒或步驟的執行狀態,另外await方法一般都會伴有超時等待的await方法,這個方法在等待指定的時間後,就不會在阻塞當前執行緒,而是繼續執行緒。
5.常用API
1)構造方法
CountDownLatch(int count): 構造方法引數指定了計數的次數。
2)void await():使當前執行緒在鎖存計數器在到零之前一直阻塞等待,除非執行緒被中斷。
3)boolean await(long timeout,TimeUnit timeUnit):使當前執行緒在鎖存計數器在到零之前一直阻塞等待,除非執行緒被中斷或者超出了指定等待的超時時間。
4)void countDown() 計數減1。當計數為0,則釋放所有等待的執行緒。
5) long getCount() 返回當前計數。
6) String toString() 返回標識此鎖存器及其狀態的字串
三、一個小小例子
唐僧監工三個徒弟去斬妖除魔,等到每個徒弟都打敗妖怪;九九八十難才過去一難!
package multiTask.bean.countDownLatch;
import java.util.concurrent.*;
/**
* Created by zyl on 2016/12/4.
*/
public class CountDownLatchDemo {
public static void main(String[] arg) throws InterruptedException {
System.out.println("current thread ..." + Thread.currentThread().getName());
CountDownLatch count = new CountDownLatch(3);
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Worker(count, "悟空"));
executorService.execute(new Worker(count, "八戒"));
executorService.execute(new Worker(count, "沙僧"));
new Boss(count, "唐僧").awaitForWorkerDone();
System.out.println("所有事情都做完了,唐僧很滿意!");
executorService.shutdown();
}
static class Boss {
private CountDownLatch count;
private String bossName;
public Boss(CountDownLatch count, String bossName) {
this.bossName = bossName;
this.count = count;
}
public void awaitForWorkerDone() throws InterruptedException {
this.count.await();
System.out.println("Boss monitor is done.");
}
}
static class Worker implements Runnable {
private CountDownLatch count;
private String workerName;
public Worker(CountDownLatch count, String workerName) {
this.count = count;
this.workerName = workerName;
}
@Override
public void run() {
System.out.println(workerName + " " + Thread.currentThread().getName() + " is running ..");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*
* 完成任務,鎖存計數減1*
* */
this.count.countDown();
}
}
}
------
三、小結
-
CountDownLatch的實質本質與Thread的join方法一樣。但join方法僅可以支援當前執行緒等待一個執行緒的結束,若需要等待多個執行緒,則需要逐個執行緒的呼叫join方法,非常麻煩。CountDwonLatch可以很方便的實現一個執行緒等待多個執行緒。
相關推薦
Java多執行緒之併發工具類
一、總論:在JDK中提供了幾種併發工具類 1)CountDownLatch(同步倒數計數器:等待多執行緒(或者多步驟)完成) 2)CyclicBarrier(迴圈屏障:同步屏障) 3)Semaphore(訊號量:控制併發程序數) 主要參考資料
java 多執行緒之利用Thread類建立執行緒(Day02)
前言:在一個程式中,如果一次只完成一件事情,很容易實現,但現實生活中很多事情都是同時進行的,所以在java中為了模擬這種狀態,引入了執行緒機制,簡單的說,當程式同時完成很多事情時,就是所謂的多執行緒。 實現執行緒的兩種方式:一是通過繼承Thread類來建立執行緒,另一種方法
java多執行緒之併發集合(CopyOnWriteArrayList)
CopyOnWriteArrayList:CopyOnWriteArrayList這是一個ArrayList的執行緒安全的變體,其原理大概可以通俗的理解為:初始化的時候只有一個容器,很常一段時間,這個容器資料、數量等沒有發生變化的時候,大家(多個執行緒),都是讀取(假設這段時
java多執行緒之併發集合(BlockingQueue)
簡介 實現 package com.np.ota.test.queue; import java.util.concurrent.BlockingQueue; import java.ut
Java多執行緒之併發安全經典案例-賣票
執行緒相關知識 1.建立執行緒的兩種方式 繼承Thread類。 實現Runnable介面。(這種方式較為常用) 2.實現Runnable介面的好處 將執行緒的任務從執行緒的子類中分
Java多執行緒之原子操作類
在併發程式設計中很容易出現併發安全問題,最簡單的例子就是多執行緒更新變數i=1,多個執行緒執行i++操作,就有可能獲取不到正確的值,而這個問題,最常用的方法是通過Synchronized進行控制來達到執行緒安全的目的。但是由於synchronized是採用的是悲觀鎖策略,並不是特別高效的一種解決方案。實際上,
java高併發系列 - 第16天:JUC中等待多執行緒完成的工具類CountDownLatch,必備技能
這是java高併發系列第16篇文章。 本篇內容 介紹CountDownLatch及使用場景 提供幾個示例介紹CountDownLatch的使用 手寫一個並行處理任務的工具類 假如有這樣一個需求,當我們需要解析一個Excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析一個sheet裡的資料
Java多執行緒系列--“JUC原子類”03之 AtomicLong原子類
轉自:https://www.cnblogs.com/skywang12345/p/3514593.html(含部分修改) 概要 AtomicInteger, AtomicLong和AtomicBoolean這3個基本型別的原子類的原理和用法相似。本章以AtomicLong對基本型別的原子類進行介紹。內容
Java多執行緒系列---“JUC原子類”04之 AtomicLongArray原子類
轉自:https://www.cnblogs.com/skywang12345/p/3514604.html(含部分修改) 概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray這3個數組型別的原子類的原理和用法相似。本章以AtomicLo
Java多執行緒系列---“JUC原子類”05之 AtomicReference原子類
轉自:http://www.cnblogs.com/skywang12345/p/3514623.html(部分修改) 概要 本章對AtomicReference引用型別的原子類進行介紹。內容包括: AtomicReference介紹和函式列表 AtomicReference原始碼分析(基於J
Java多執行緒系列---“JUC原子類”06之 AtomicLongFieldUpdater原子類
轉自:http://www.cnblogs.com/skywang12345/p/3514635.html (含部分修改) 概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater這3個修改類的成員的原
Java多執行緒系列---“JUC原子類”01之 原子類的實現(CAS演算法)
轉自:https://blog.csdn.net/ls5718/article/details/52563959 & https://blog.csdn.net/mmoren/article/details/79185862(含部分修改) 在JDK 5之前Java語言是靠
Java多執行緒系列---“JUC原子類”02之 框架
轉自:http://www.cnblogs.com/skywang12345/p/3514589.html 根據修改的資料型別,可以將JUC包中的原子操作類可以分為4類。 1. 基本型別: AtomicInteger, AtomicLong, AtomicBoolean ;2.&
Java多執行緒與併發庫高階應用之倒計時計數器CountDownLatch
CountDownLatch類是一個倒計時計數器,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。用給定的計數初始化 CountDownLatch。由於呼叫了countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,
java多執行緒之物件的併發訪問
1.synchronized同步方法 --1.1方法內的變數是執行緒安全的 解釋:由於方法內的變數是私有的,本體訪問的同時別人訪問不了,所以是執行緒安全的。 --1.2例項變數是非執行緒安全的 解釋:
Java多執行緒之併發包,併發佇列
目錄 1 併發包 2 併發佇列 1 併發包 1.1同步容器類 1.1.1Vector與ArrayList區別 1.1.1.1 ArrayList是最常用的List實現類,內部是通過陣列實現的,它允許對
Java多執行緒之物件及變數的併發訪問
Java物件及變數的併發訪問 當多個執行緒同時對同一個物件中的例項變數進行併發訪問時可能會產生執行緒安全問題。產生的後果就是”髒讀”,即收到的資料其實是被更改過的。 如果訪問的是方法中的變數,則不存在”非執行緒安全”問題 可以通過以下幾種方式來解決,在對物
java多執行緒系列--"JUC"原子類 01 之框架
根據修改的資料型別,可以將JUC包中的原子操作類可以分為4類 1 基本型別:AtomicInteger,AtomicLong,AtomicBoolean; 2 陣列型別:AtomicIntegerArray,AtomicLongArray,AtomicReferenceA
Java多執行緒系列--“JUC原子類”01之 框架
根據修改的資料型別,可以將JUC包中的原子操作類可以分為4類。 基本型別: AtomicInteger,AtomicLong, AtomicBoolean ; 陣列型別: AtomicIntegerArray, AtomicLongArray,Ato
java多執行緒與併發之建立執行緒的幾種方式
1、繼承Thread類方法 public class Demo1 extends Thread{ @Override public void run() { //判斷標誌 while(true) { System.out.println(get