您好,登錄后才能下訂單哦!
今天小編給大家分享一下Java并發(fā)編程同步器CountDownLatch怎么用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
CountDownLatch
在日常開發(fā)中經常會遇到需要在主線程中開啟多個線程去并行執(zhí)行任務,并且主線程需要等待所有子線程執(zhí)行完畢后再進行匯總的場景。在 CountDownLatch 出現(xiàn)之前般都使用線程的join()方法來實現(xiàn)這一點,但是 join 方法不夠靈活,不能夠滿足不同場景的需要,所以 JDK 開發(fā)組提供了 CountDownLatch
這個類,我們前面介紹的例子使用 CoumtDownLatch
會更優(yōu)雅。
使用CountDownLatch 的代碼如下:
package LockSupportTest; import java.util.concurrent.CountDownLatch; public class JoinCountDownLatch { private static volatile CountDownLatch countDownLatch = new CountDownLatch(2); public static void main(String[] args) throws InterruptedException{ Thread threadOne = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); System.out.println("child threadOne over!"); } catch (InterruptedException e) { e.printStackTrace(); } finally { countDownLatch.countDown(); } } }); Thread threadTwo = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); System.out.println("child threadOne over!"); } catch (InterruptedException e) { e.printStackTrace(); } finally { countDownLatch.countDown(); } } }); threadOne.start(); threadTwo.start(); System.out.println("wait all child thread over!!!"); countDownLatch.await(); System.out.println("all child thread over!"); } }
在如上代碼中,創(chuàng)建了一個 CountDownLatch
實例,因為有兩個子線程所以構造函數(shù)的傳參為2。主線程調用countDownLatch.await()
方法后會被阻塞。子線程執(zhí)行完畢后調用 countDownLatch.countDown()
方法讓 countDownLatch 內部的計數(shù)器減1,所有子線程執(zhí)行完畢并調用 countDown()方法后計數(shù)器會變?yōu)?,這時候主線程的await()方法才會返回。其實上面的代碼還不夠優(yōu)雅,在項目實踐中一般都避免直接操作線程,而是使用 ExceutorService線程池來管理,使用ExcsuIwsnise時傳遞的參數(shù)是 Runable 或者 Callable對象,這時候你沒有辦法直接調用這些線程的join()方法,這就需要選擇使用CountDownLatch
了。
將上面的代碼修改為:
package LockSupportTest; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class JoinCountDownLatch3 { private static volatile CountDownLatch countDownLatch = new CountDownLatch(2); public static void main(String[] args) throws InterruptedException{ ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.submit(new Runnable() { @Override public void run() { try { Thread.sleep(1000); System.out.println("child threadOne over!"); } catch (InterruptedException e) { e.printStackTrace(); } finally { countDownLatch.countDown(); } } }); executorService.submit(new Runnable() { @Override public void run() { try { Thread.sleep(1000); System.out.println("child threadTwo over!"); } catch (InterruptedException e) { e.printStackTrace(); } finally { countDownLatch.countDown(); } } }); System.out.println("wait all child thread over!!!"); countDownLatch.await(); System.out.println("all child thread over!"); executorService.shutdown(); } }
以上就是“Java并發(fā)編程同步器CountDownLatch怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。