Java多線程編程之CountDownLatch同步對象應用實例。本站提示廣大學習愛好者:(Java多線程編程之CountDownLatch同步對象應用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java多線程編程之CountDownLatch同步對象應用實例正文
似乎倒計時計數器,挪用CountDownLatch對象的countDown辦法就將計數器減1,當達到0時,一切期待者就開端履行。
java.util.concurrent.CountDownLatch
一個同步幫助類,在完成一組正在其他線程中履行的操作之前,它許可一個或多個線程一向期待。用給定的計數初始化CountDownLatch。因為挪用了countDown()辦法,所以在以後計數達到零之前,await辦法會一向受壅塞。以後,會釋放一切期待的線程,await的一切後續挪用都將立刻前往。這類景象只湧現一次——計數沒法被重置。假如須要重置計數,請斟酌應用CyclicBarrier。
CountDownLatch是一個通用同步對象,它有許多用處。將計數1初始化的CountDownLatch用作一個簡略的開/關鎖存器,或進口:在經由過程挪用countDown()的線程翻開進口前,一切挪用await的線程都一向在進口處期待。用N初始化的 CountDownLatch可使一個線程在N個線程完成某項操作之前一向期待,或許使其在某項操作完成N次之前一向期待。
CountDownLatch的一個有效特征是,它不請求挪用countDown辦法的線程比及計數達到零時才持續,而在一切線程都能經由過程之前,它只是阻攔任何線程持續經由過程一個await。
舉例:多個活動員期待裁判敕令:裁判等一切活動員到齊後宣布成果
package com.ljq.test.thread; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountdownLatchTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); //裁判宣布敕令的計數器,計數器為0,活動員就跑 final CountDownLatch cdOrder = new CountDownLatch(1); //活動員跑到起點的計數器,為0裁判宣告成果 final CountDownLatch cdAnswer = new CountDownLatch(3); //發生3個活動員 for(int i=0;i<3;i++){ Runnable runnable = new Runnable(){ public void run(){ try { System.out.println("線程" + Thread.currentThread().getName() + "正預備接收敕令"); cdOrder.await(); System.out.println("線程" + Thread.currentThread().getName() + "已接收敕令"); Thread.sleep((long)(Math.random()*10000)); System.out.println("線程" + Thread.currentThread().getName() + "回報命令處置成果"); cdAnswer.countDown(); } catch (Exception e) { e.printStackTrace(); } } }; service.execute(runnable); //活動員開端義務 } try { //裁判歇息一會 再宣布敕令 Thread.sleep((long)(Math.random()*10000)); System.out.println("線程" + Thread.currentThread().getName() + "行將宣布敕令"); cdOrder.countDown(); //敕令計數器置為0,宣布敕令 System.out.println("線程" + Thread.currentThread().getName() + "已發送死令,正在期待成果"); cdAnswer.await(); //期待一切活動員,計數器為0 一切活動員到位 System.out.println("線程" + Thread.currentThread().getName() + "已收到一切呼應成果"); } catch (Exception e) { e.printStackTrace(); } service.shutdown(); } }
前往成果:
線程pool-1-thread-3正預備接收敕令 線程pool-1-thread-1正預備接收敕令 線程pool-1-thread-2正預備接收敕令 線程main行將宣布敕令 線程main已發送死令,正在期待成果 線程pool-1-thread-2已接收敕令 線程pool-1-thread-1已接收敕令 線程pool-1-thread-3已接收敕令 線程pool-1-thread-3回報命令處置成果 線程pool-1-thread-2回報命令處置成果 線程pool-1-thread-1回報命令處置成果 線程main已收到一切呼應成果