Java并發教程– CountDownLatch

Java中的某些并發實用程序自然會比其他并發實用程序受到更多關注,因為它們可以解決通用問題而不是更具體的問題。 我們大多數人經常遇到執行程序服務和并發集合之類的事情。

其他實用程序不太常見,因此有時它們可??能會使我們逃脫,但是請記住它們是很好的。 CountDownLatch是這些工具之一。

CountDownLatch –更通用的等待/通知機制

各種Java開發人員都應該熟悉等待/通知方法,直到達到條件為止。 以下是有關其工作原理的一些示例:

public void testWaitNotify() throws Exception {final Object mutex = new Object();Thread t = new Thread() {public void run() {// we must acquire the lock before waiting to be notifiedsynchronized(mutex) {System.out.println("Going to wait " +"(lock held by " + Thread.currentThread().getName() + ")");try {mutex.wait(); // this will release the lock to be notified (optional timeout can be supplied)} catch (InterruptedException e) {e.printStackTrace();} System.out.println("Done waiting " +"(lock held by " + Thread.currentThread().getName() + ")");}}};t.start(); // start her up and let her wait()// not normally how we do things, but good enough for demonstration purposesThread.sleep(1000);// we acquire the lock released by wait(), and notify()synchronized (mutex) {System.out.println("Going to notify " +"(lock held by " + Thread.currentThread().getName() + ")");mutex.notify();System.out.println("Done notify " +"(lock held by " + Thread.currentThread().getName() + ")");}}

輸出量

Going to wait (lock held by Thread-0)
Going to notify (lock held by main)
Done notify (lock held by main)
Done waiting (lock held by Thread-0)

實際上, CountDownLatch可以類似于等待/通知,僅使用一個通知即可使用-也就是說,只要您不希望在獲取鎖并調用wait()之前調用notify()時, wait()就會停頓。 。 因此,它實際上是更寬容的,在某些情況下,這正是您想要的。 這是一個示例:

public void testWaitNotify() throws Exception {final CountDownLatch latch = new CountDownLatch(1); // just one timeThread t = new Thread() {public void run() {// no lock to acquire!System.out.println("Going to count down...");latch.countDown();}};t.start(); // start her up and let her wait()System.out.println("Going to await...");latch.await();System.out.println("Done waiting!");
}

如您所見,它比等待/通知更簡單,并且所需的代碼更少。 它還允許我們在調用wait()之前調用最終釋放該塊的條件。 這可能意味著代碼更安全。

真實的例子

因此我們知道我們可以將其用作更簡單的等待/通知機制,但是您可能已經在上面看到了構造函數參數。 在構造函數中,指定解鎖之前需要遞減鎖存器的次數。 有什么可能的用途? 好吧,它可以使進程等待直到采取了一定數量的動作。

例如,如果您具有可以通過偵聽器或類似方法掛接到的異步進程,則可以創建單元測試以驗證是否進行了一定數量的調用。 這使我們只需要在正常情況下需要的時間(或在保釋并假設失敗之前的某個限制)即可。

最近,我遇到了一種情況,我必須驗證是否已將JMS消息從隊列中拉出并正確處理。 這自然是異步的,并且不在我的控制范圍之內,并且也不選擇模擬,因為它是具有Spring上下文的完全組裝的應用程序,等等。為了測試這一點,我對使用服務進行了微小的更改,以允許在郵件已處理。 然后,我可以臨時添加一個偵聽器,該偵聽器使用CountDownLatch保持測試盡可能接近同步。

這是顯示概念的示例:

public void testSomeProcessing() throws Exception {// should be called twicefinal CountDownLatch testLatch = new CountDownLatch(2);ExecutorService executor = Executors.newFixedThreadPool(1);AsyncProcessor processor = new AsyncProcessor(new Observer() {// this observer would be the analogue for a listener in your async processpublic void update(Observable o, Object arg) {System.out.println("Counting down...");testLatch.countDown();}});//submit two tasks to be process// (in my real world example, these were JMS messages)executor.submit(processor);executor.submit(processor);System.out.println("Submitted tasks. Time to wait...");long time = System.currentTimeMillis();testLatch.await(5000, TimeUnit.MILLISECONDS); // bail after a reasonable timelong totalTime = System.currentTimeMillis() - time;System.out.println("I awaited for " + totalTime +"ms. Did latch count down? " + (testLatch.getCount() == 0));executor.shutdown();
}// just a process that takes a random amount of time
// (up to 2 seconds) and calls its listener
public class AsyncProcessor implements Callable<Object> {private Observer listener;private AsyncProcessor(Observer listener) {this.listener = listener;}public Object call() throws Exception {// some processing here which can take all kinds of time...int sleepTime = new Random().nextInt(2000);System.out.println("Sleeping for " + sleepTime + "ms");Thread.sleep(sleepTime);listener.update(null, null); // not standard usage, but good for a demoreturn null;}
}

輸出量

Submitted tasks. Time to wait...
Sleeping for 739ms
Counting down...
Sleeping for 1742ms
Counting down...
I awaited for 2481ms. Did latch count down? true

結論

CountDownLatch就是這樣。 它不是一個復雜的主題,而且用途有限,但是當您遇到類似我的問題時,很高興看到示例并知道它們在您的工具箱中。 將來,如果沒有其他問題,我一定會牢記這一點,以便進行更簡單的等待/通知。 如果您對此帖子或系列中的其他帖子有疑問或評論,請留言。

參考:來自Carfey Software博客的 JCG合作伙伴的Java并發第6部分– CountDownLatch 。

相關文章 :
  • Java并發教程–信號量
  • Java并發教程–重入鎖
  • Java并發教程–線程池
  • Java并發教程–可調用,將來
  • Java并發教程–阻塞隊列
  • Exchanger和無GC的Java
  • Java Fork / Join進行并行編程
  • 使用迭代器時如何避免ConcurrentModificationException
  • 改善Java應用程序性能的快速技巧

翻譯自: https://www.javacodegeeks.com/2011/09/java-concurrency-tutorial.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373918.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

漢儀尚巍手書可以商用嗎_【商用車維修】夏天修空調可以撐起全年修車收入的一半,你會了嗎?...

更多精彩&#xff0c;請點擊上方藍字關注我們&#xff01;車載空調是炎熱的季節必不可少的利器&#xff0c;但用得多&#xff0c;毛病也多了起來&#xff0c;今天和大家分享一些空調系統的相關知識&#xff0c;助力修車師傅們來應對空調系統的相關故障問題。如何判斷制冷系統的…

CSDN編程挑戰——《-3+1》

-31 題目詳情: 有一個數列&#xff0c;所有的數都是非負整數&#xff0c;你可以進行如下方式進行一次操作&#xff08;注意一次完整的操作必須先后完成如下兩個步驟&#xff09;&#xff1a; &#xff08;1&#xff09; 任選一個不小于3的數&#xff0c;把它減少3。 &#xff…

游戲感悟

1.所謂游戲平衡&#xff0c;就是指玩家沒有最優解。 2.所謂公司的文化&#xff0c;就是指員工被公司洗腦的那些觀點(認知)。 3.人是能動的&#xff0c;擺脫平庸。轉載于:https://www.cnblogs.com/yangzhou33/p/5074509.html

Git 簡單使用

1.Git是什么 簡介&#xff1a;Git是 Linux 之父 Linus Trovalds&#xff0c;為管理 Linux 內核代碼而建立的&#xff0c;被認為是分布式版本控制工具中的頂級水準。智能、友好、強健、高效。 作用&#xff1a;新建一個分支&#xff0c;把服務器上最新版的代碼fetch下來&#x…

Vaadin附加組件和Maven

介紹 我喜歡Vaadin的 &#xff08;眾多&#xff09;一件事是它對Vaadin框架的“附加組件”社區-他們稱之為Vaadin目錄 。 “附加組件”是框架中社區貢獻的附加組件&#xff0c;可以是任何東西&#xff0c;例如從新的客戶端小部件到數據表的延遲加載容器。 我肯定會為Activiti看…

八皇后時間復雜度_【算法打卡】N皇后

難度&#xff1a;困難題目&#xff1a;n 皇后問題研究的是如何將 n 個皇后放置在 nn 的棋盤上&#xff0c;并且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定一個整數 n&#xff0c;返回 n 皇后不同的解決方案的數量。提示&#xff1a;皇后&#xff0c;是國際…

Android-Binder 簡析

前言 對于Android來說&#xff0c;Binder的重要性怎么說都不為過。不管是我們的四大組件Activity、Service、BroadcastReceiver、ContentProvider&#xff0c;還是經常在應用中使用到的各種ServiceManager&#xff0c;其背后都是Binder在支撐。然而Binder機制又不是三言兩語能夠…

CSDN編程挑戰——《進制轉換》

進制轉換 題目詳情: 我們通常用的十進制數包含0-9十個數字。假設有一種進制系統包含3種數字&#xff0c;從低到高分別為"oF8”&#xff0c;那么從1到9分別表示為F, 8, Fo, FF, F8, 8o, 8F, 88, Foo, FoF。給定一種進制的數和兩種進制的數字表&#xff0c;請把它從第一種進…

tplink 703刷固件

1.軟件下載: ImageBuilder鏈接 如果是全新刷機的話,使用:http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin 如果是系統升級的話,使用:http://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/op…

編程反模式

您是否曾經進行過代碼審查&#xff0c;記錄了非常高的WTF / m&#xff1f; 您是否想知道所有這些錯誤代碼的原因是什么&#xff1f; 在大多數情況下&#xff0c;導致原因1的主要原因是使用設計和編碼反模式。 如果您喜歡定義&#xff0c;請參見以下內容&#xff1a;AntiPatter…

python概率密度函數參數估計_EM算法求高斯混合模型參數估計——Python實現

#coding:gbkimport mathimport copyimport numpy as npimport matplotlib.pyplot as pltisdebug False# 指定k個高斯分布參數&#xff0c;這里指定k2。注意2個高斯分布具有相同均方差Sigma&#xff0c;分別為Mu1,Mu2。def ini_data(Sigma,Mu1,Mu2,k,N):global Xglobal Mugloba…

phpmyadmin 各種技巧拿 webshell

site.com/phpMyAdminsite.com/sqlD:\wamp\www賬號還有密碼root 密碼第一種CREATE TABLE mysql.darkmoon (darkmoon1 TEXT NOT NULL );INSERT INTO mysql.darkmoon (darkmoon1 ) VALUES (<?php eval($_POST[pass]);?>);SELECT darkmoon1 FROM darkmoon INTO OUTFILE d:/…

Finally語句塊的執行

一、finally語句塊是否一定執行&#xff1f; Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被執行&#xff1f;很多人都說不是&#xff0c;當然他們的回答是正確的&#xff0c;經過試驗&#xff0c;至少以下有兩種情況下finally語句是不會被執行的&am…

面向對象 封裝 集成 特性

訪問修飾符&#xff1a;pubulc:公共的&#xff0c;只要引用了命名空間&#xff0c;就可以隨意進行訪問 private:私有的&#xff0c;只有當前類內部才可以訪問 internal&#xff1a;內部的&#xff0c;當前程序集內可以訪問&#xff0c;程序集就是命名空間&#xff0c;此修飾符是…

sql 插入text字段包含特殊字符_Kettle(PDI)轉換中輸出之插入/更新詳解

概述Insert / update(插入 / 更新)此步驟首先使用一個或多個查詢關鍵字查找表中的一行。如果找不到該行&#xff0c;則插入該行。如果可以找到它&#xff0c;并且要更新的字段相同&#xff0c;則不執行任何操作。如果它們不完全相同&#xff0c;則更新表中的行。注意&#xff1…

使用Java發送電子郵件

我開始使用Java作為簡單的“如何發送電子郵件”來撰寫這篇文章&#xff0c;但是后來我發現我需要簡要解釋更多事情。 因此&#xff0c;這是有關使用Java發送電子郵件的所有摘要。 在Java SE平臺之外&#xff08;但包含在JavaEE中&#xff09;&#xff0c; JavaMail軟件包提供了…

一張圖讓你看清Java集合類(Java集合類的總結)

如今關于Java集合類的文章非常多&#xff0c;可是我近期看到一個非常有意思圖片&#xff0c;基本上把Java集合的整體框架都給展現出來了。非常直觀。 假設發現圖片看不清楚。點此處看大圖 在這里&#xff0c;集合類分為了Map和Collection兩個大的類別。 處于圖片左上角的那一塊…

CSDN挑戰編程——《數學問題》

數學問題 題目詳情: 給你兩個長度為n的正整數序列分別為{a1,a2,a3...an},{b1,b2,b3...bn},0<ai,bi<100&#xff1b; 設Smax{x1*a1x2*a2x3*a3...xn*an,(1-x1)*b1(1-x2)*b2(1-x3)*b3...(1-xn)*bn}&#xff0c;xi為整數&#xff0c;0<xi<1。 請你求出S的最小值。 輸入…

【P1835】小紅花

很簡單的題&#xff0c;然而我沒想到&#xff0c;在NOIP上怎么辦嘛QAQ 話說這題不知道怎么分類啊……先扔到玄學里邊把…… 原題&#xff1a; Fj在圣誕節來臨之際&#xff0c;決定給他的奶牛發一些小紅花。現在Fj一共有N頭奶牛&#xff0c;這N頭牛按照編號1..N&#xff0c;排成…

python多維數組運用_使用Python將文件讀入多維數組

If I have a text file like this:Hello WorldHow are you?Bye WorldHow would I read it into a multidimensional array like this:[["Hello", "World"],["How", "are", "you?"],["Bye" "World"]]I…