中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中常用的并發工具有哪些

發布時間:2021-08-20 09:04:39 來源:億速云 閱讀:155 作者:chen 欄目:云計算

這篇文章主要講解了“java中常用的并發工具有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java中常用的并發工具有哪些”吧!

1)閉鎖CountDownLatch

功能:讓一個主線程等待一組工作線程執行完畢之后,才繼續執行主線程,與join()方法的功能類似。

原理:
	1)CountDownLatch是通過一個計數器來實現的,計數器的初始值為需要等待線程的數量。
	2)當一個線程完成了自己的任務后,計數器的值就會減1。
	3)當計數器值為0時,說明所有的線程都執行完了,此時,在閉鎖上等待的線程就可以恢復執行任務。

注意:
	1)countDown()可以在每個線程中調用一次,也可以在一個線程中調用多次。
	2)計數器必須大于等于0,計數器為0時,調用await方法時不會阻塞當前線程。

2)屏障(柵欄)CyclicBarrier

功能:讓一組線程到達一個屏障時被阻塞,直到最后一個線程到達屏障時,屏障才會開門(trip),所有被屏障攔截的線程才會繼續運行。

CyclicBarrier和CountDownLatch的區別:

	1)CountDownLatch的計數器只能使用一次,而CyclicBarrier的計數器可以使用reset()方法重置。
	2)到達某個點后,使用CountDownLatch的線程繼續運行,使用CyclicBarrier的線程停止運行:
		使用CountDownLatch的線程運行到某個點之后,調用 countDown() 方法將計數器的值減1,之后線程繼續執行。
		使用CyclicBarrier 的線程運行到某個點之后,調用 await()	   方法使該線程停止運行,直到所有的線程都到達了這個點(調用await方法),(所有的)線程才可以繼續運行。

3)信號量Semaphore

功能:控制并發的線程數。

原理:
	1)線程通過acquire()方法獲取許可證。
	2)線程通過release()方法歸還許可證。

說明:使用tryAcquire()方法可以立即得到執行的結果:嘗試獲取一個許可證,若獲取成功,則立即返回true,若獲取失敗,則立即返回false。
	
應用:流量控制,例如數據庫連接數的控制等。

4)交換者Exchanger

功能:兩個線程間數據的交換。

原理:
	1)線程A調用public V exchange(V dataA)方法,線程A到達同步點,并且在線程B到達同步點前一直等待。
	2)線程B調用public V exchange(V dataB)方法,線程B到達同步點。
	3)線程A與線程B都達到同步點時,線程將自己的數據傳遞給對方,兩個線程完成了數據的交換了。
	
 舉例:
	public class ExchangerTest {
		public static void main(String[] args) {
			
			final Exchanger<String> exchanger = new Exchanger<String>();
			
			ExecutorService service = Executors.newFixedThreadPool(2);

			service.execute(new Runnable() {
				public void run() {
					try {
						String originalData = "dataA";
						Thread.sleep(2000);
						System.out.println("線程" + Thread.currentThread().getName() + "正在把數據[" + originalData + "]傳遞出去..." + "	time:" + System.currentTimeMillis());
						String exchangedData = exchanger.exchange(originalData);
						System.out.println("線程" + Thread.currentThread().getName() + "獲取到另一線程的數據[" + exchangedData + "]" + "	time:" + System.currentTimeMillis());
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});

			service.execute(new Runnable() {
				public void run() {
					try {
						String originalData = "dataB";
						Thread.sleep(6000);
						System.out.println("線程" + Thread.currentThread().getName() + "正在把數據[" + originalData + "]傳遞出去..." + "	time:" + System.currentTimeMillis());
						String exchangedData = exchanger.exchange(originalData);
						System.out.println("線程" + Thread.currentThread().getName() + "獲取到另一線程的數據[" + exchangedData + "]" + "	time:" + System.currentTimeMillis());
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
		}
	}
	
	結果:
		線程pool-1-thread-1正在把數據[dataA]傳遞出去...	time:1506414528645
		線程pool-1-thread-2正在把數據[dataB]傳遞出去...	time:1506414532645
		線程pool-1-thread-2獲取到另一線程的數據[dataA]	time:1506414532645
		線程pool-1-thread-1獲取到另一線程的數據[dataB]	time:1506414532645

感謝各位的閱讀,以上就是“java中常用的并發工具有哪些”的內容了,經過本文的學習后,相信大家對java中常用的并發工具有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙胜| 南乐县| 临潭县| 永州市| 故城县| 象山县| 肥西县| 东海县| 衢州市| 神池县| 报价| 丹寨县| 栖霞市| 景洪市| 洞口县| 临邑县| 金平| 贵港市| 卓资县| 安宁市| 东港市| 兖州市| 射阳县| 民权县| 镇坪县| 锡林浩特市| 夏河县| 伊吾县| 九台市| 灯塔市| 资讯| 城市| 西盟| 车险| 涞水县| 张家口市| 四子王旗| 塘沽区| 且末县| 扶绥县| 金乡县|