JAVA多線程CountDownLatch使用詳解
前序:
上周測試給開發(fā)的同事所開發(fā)的模塊提出了一個bug,并且還是偶現(xiàn)。
經(jīng)過仔細查看代碼,發(fā)現(xiàn)是在業(yè)務中啟用了多線程,2個線程同時跑,但是新啟動的2個線程必須保證一個完成之后另一個再繼續(xù)運行,才能消除bug。
什么時候用?
多線程是在很多地方都會用到的,但是我們?nèi)绻胍獙崿F(xiàn)在某個特定的線程運行完之后,再啟動另外一個線程呢,這個時候CountDownLatch就可以派上用場了
怎么用?
先看看普通的多線程代碼:
package code; public class MyThread extends Thread { public static void main(String[] args) { MyThread th = new MyThread(); Thread t1 = new Thread(th, "Mythread"); t1.start(); System.out.println(Thread.currentThread().getName()); } public void run() { Mythread1 th2 = new Mythread1(); Thread t2 = new Thread(th2, "Mythread1"); t2.start(); System.out.println(this.currentThread().getName()); } class Mythread1 extends Thread { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.currentThread().getName()); } } }
代碼如上,先用MyThread繼承了Thread類,然后在MyThread類內(nèi)部又寫了一個MyThread1類,同樣也是繼承了Thread類,并且在run方法里面讓它睡1秒,這樣運行代碼,就會打印出:
從上面的輸出順序可以看出,先是啟動了main線程,然后再啟動了MyThread線程,在MyThread線程中,又啟動了MyThread1線程。但是由于讓MyThread1線程睡了1秒,模擬處理后續(xù)業(yè)務,這樣他就比MyThread運行完畢的時間晚一些。
現(xiàn)在,在代碼中加上CountDownLatch ,要讓MyThread1先運行完畢,再讓MyThread繼續(xù)運行。
package code; import java.util.concurrent.CountDownLatch; public class MyThread extends Thread { CountDownLatch countDownLatch = new CountDownLatch(1); public static void main(String[] args) { MyThread th = new MyThread(); Thread t1 = new Thread(th, "Mythread"); t1.start(); System.out.println(Thread.currentThread().getName()); } public void run() { Mythread1 th2 = new Mythread1(); Thread t2 = new Thread(th2, "Mythread1"); t2.start(); try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.currentThread().getName()); } class Mythread1 extends Thread { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.currentThread().getName()); countDownLatch.countDown(); } } }
代碼寫法如上所示,大致分三步
1、我們先new一個CountDownLatch對象入?yún)⒃O置為1(我個人理解的這個就像是new一個數(shù)組一樣,什么時候數(shù)組清空了,那就可以讓被中斷的線程繼續(xù)運行了)
2、在MyThread類中調(diào)用countDownLatch.await();讓當前線程停止運行。
3、在Mythread1類中調(diào)用countDownLatch.countDown()方法。當Mythread1全部執(zhí)行完畢,再最后調(diào)用該方法,作用就是把我說的“數(shù)組”清空。
看看輸出的打印結(jié)果
結(jié)果如上圖,是符合預期的結(jié)果的。
最后再說下CountDownLatch countDownLatch = new CountDownLatch(1)的入?yún)ⅲ@塊設置的是1,那就需要調(diào)用一次countDownLatch.countDown()減去1。
如果是其他數(shù)字,那就要調(diào)用相應的次數(shù),否則調(diào)用countDownLatch.await()的線程都不會被繼續(xù)執(zhí)行。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Spring Boot和Docker實現(xiàn)微服務部署的方法
這篇文章主要介紹了Spring Boot和Docker實現(xiàn)微服務部署的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01Java使用嵌套循環(huán)模擬ATM機取款業(yè)務操作示例
這篇文章主要介紹了Java使用嵌套循環(huán)模擬ATM機取款業(yè)務操作,結(jié)合實例形式分析了Java模擬ATM機取款業(yè)務操作的相關流程控制、數(shù)值判斷等操作技巧,需要的朋友可以參考下2019-11-11IDEA在SpringBoot項目使用Maven打包后jar包太小問題及解決
這篇文章主要介紹了IDEA在SpringBoot項目使用Maven打包后jar包太小問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04java實現(xiàn)單鏈表中是否有環(huán)的方法詳解
本篇文章介紹了,用java實現(xiàn)單鏈表中是否有環(huán)的方法詳解。需要的朋友參考下2013-05-05mybatis resultmap 如何為對象賦值的調(diào)用順序
這篇文章主要介紹了mybatis resultmap 如何為對象賦值的調(diào)用順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01MyBatis與SpringMVC相結(jié)合實現(xiàn)文件上傳、下載功能
這篇文章主要介紹了MyBatis與SpringMVC相結(jié)合實現(xiàn)文件上傳、下載功能的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06