CountDownLatch中count down是倒數的意思,latch則是門閂的含義。整體含義可以理解為倒數的門栓,似乎有一點“三二一,芝麻開門”的感覺。
CountDownLatch的作用也是如此,在構造CountDownLatch(int count):的時候需要傳入一個整數count,在這個整數“倒數”到0之前,主線程需要等待在門口,而這個“倒數”過程則是由各個執行線程驅動的,每個線程執行完一個任務“倒數”一次。
總結來說,CountDownLatch的作用就是等待其他的線程都執行完任務,必要時可以對各個任務的執行結果進行匯總,然后主線程才繼續往下執行。
這里需要注意的是,await()方法并沒有規定只能有一個線程執行該方法,如果多個線程同時執行await()方法,那么這幾個線程都將處于等待狀態,并且以共享模式享有同一個鎖。
這里需要注意的是,countDown()方法并沒有規定一個線程只能調用一次,當同一個線程調用多次countDown()方法時,每次都會使計數器減一;
下面的示例展示了一個簡單的網站爬蟲,它使用 CountDownLatch 在主線程中等待其他爬蟲線程完成任務。
在這個例子中,我們要爬取一組網站的內容,在主線程中等待所有爬蟲任務完成。
首先,我們創建一個 URLs 列表,包含多個網站 URL。
然后,我們使用 CountDownLatch 實例 latch 來跟蹤待完成的爬蟲任務數量。
接著,我們遍歷 URL 列表,為每個 URL 創建一個新的 Crawler 線程。Crawler 類實現了 Runnable 接口,用于讀取指定 URL 的網頁內容。在完成任務后,它調用 latch.countDown() 方法減少計數值。
最后,在主線程中,我們調用 latch.await() 方法等待所有爬蟲線程完成任務。當所有任務完成時,打印一條消息表示爬蟲任務已完成。
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch;public class WebCrawler {private static class Crawler implements Runnable {private final String url;private final CountDownLatch latch;public Crawler(String url, CountDownLatch latch) {this.url = url;this.latch = latch;}@Overridepublic void run() {try {URL urlObject = new URL(url);BufferedReader in = new BufferedReader(new InputStreamReader(urlObject.openStream()));String inputLine;StringBuilder content = new StringBuilder();while ((inputLine = in.readLine()) != null) {content.append(inputLine);content.append("\n");}in.close();System.out.println("爬取 " + url + " 成功, 內容大小: " + content.length() + " 字符");} catch (Exception e) {System.err.println("爬取 " + url + " 失敗, 原因: " + e.getMessage());} finally {latch.countDown();}}}public static void main(String[] args) throws InterruptedException {List<String> urls = new ArrayList<>();urls.add("https://github.com/");urls.add("https://stackoverflow.com/");urls.add("https://www.zhihu.com/");urls.add("https://www.reddit.com/");urls.add("https://www.linkedin.com/");CountDownLatch latch = new CountDownLatch(urls.size());System.out.println("開始爬蟲任務...");for (String url : urls) {new Thread(new Crawler(url, latch)).start();}latch.await();System.out.println("所有爬蟲任務都已完成!");} }這是一個稍復雜的 CountDownLatch 示例。
在這個例子中,我們將模擬一個簡單的賽車游戲,
在這個例子中,我們創建了兩個 CountDownLatch,
當倒計時結束時,調用 startSignal.countDown(),開始信號變為0,并表示比賽開始。
每個線程在模擬賽車完成比賽后,調用 finishSignal.countDown() 減少完成信號計數。
主線程使用 finishSignal.await() 等待所有賽車線程都完成比賽。當計數值變為 0 時,主線程將打印一條消息表示所有賽車都完成了比賽。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
tendystar308藍牙耳機的密碼多少?tendystar308藍牙耳機的密碼默認為0000,無需修改。具體使用方法如下:1。新耳機開機后,會有語音提示自動搜索配對設備。此時,為手機和其他支持藍牙的設備打開藍牙。 2. 打開手機和其他設備上的可檢測性,即可以檢測附近的藍牙信號。然后搜索附近的藍牙信號,搜索藍牙耳機(一般會顯示藍牙耳機的型號),然后點擊連接。如果系統提示您輸入密碼,則默認值為00...
e站app怎么用?E站應用程序是一樣的,通過手機號碼,你可以設置一個帳號和密碼,登錄使用使用一個叫“泡芙瀏覽器”的軟件。打開網站的正確方法-亨泰網如果您有帳戶,請直接登錄。如果你沒有賬戶,就注冊一個。2注冊過程非常簡單。首先單擊register,然后會出現一堆TOS。單擊“同意”注冊。三。輸入要注冊的用戶名(登錄賬號)和要顯示的名稱(類似昵稱),輸入并確認密碼和電子郵件,最后輸入要注冊的驗證碼。4...
大興區工業開發區的郵編是多少?你是說大興經濟技術開發區吧?在亦莊開發區,郵編是100176。北京各區各地的郵編?東城區的郵政編碼是: 10萬東城區100000西城區100000朝陽區100000豐臺區100000石景山區100000海淀區100000門頭溝區102300房山區102400通州區101100順義區101300昌平區102200大興區102600懷柔區101400平谷區101200密云...