JAVA多线程之CountDownLatch
前序:
上周測試給開發(fā)的同事所開發(fā)的模塊提出了一個(gè)bug,并且還是偶現(xiàn)。
經(jīng)過仔細(xì)查看代碼,發(fā)現(xiàn)是在業(yè)務(wù)中啟用了多線程,2個(gè)線程同時(shí)跑,但是新啟動(dòng)的2個(gè)線程必須保證一個(gè)完成之后另一個(gè)再繼續(xù)運(yùn)行,才能消除bug。
什么時(shí)候用?
多線程是在很多地方都會(huì)用到的,但是我們?nèi)绻胍獙?shí)現(xiàn)在某個(gè)特定的線程運(yùn)行完之后,再啟動(dòng)另外一個(gè)線程呢,這個(gè)時(shí)候CountDownLatch就可以派上用場了
怎么用?
先看看普通的多線程代碼:
1 package code; 2 3 public class MyThread extends Thread { 4 public static void main(String[] args) { 5 MyThread th = new MyThread(); 6 Thread t1 = new Thread(th, "Mythread"); 7 t1.start(); 8 System.out.println(Thread.currentThread().getName()); 9 } 10 public void run() 11 { 12 Mythread1 th2 = new Mythread1(); 13 Thread t2 = new Thread(th2, "Mythread1"); 14 t2.start(); 15 System.out.println(this.currentThread().getName()); 16 } 17 class Mythread1 extends Thread 18 { 19 public void run() { 20 try { 21 Thread.sleep(1000); 22 } catch (InterruptedException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 System.out.println(this.currentThread().getName()); 27 } 28 29 } 30 }代碼如上,先用MyThread繼承了Thread類,然后在MyThread類內(nèi)部又寫了一個(gè)MyThread1類,同樣也是繼承了Thread類,并且在run方法里面讓它睡1秒,這樣運(yùn)行代碼,就會(huì)打印出:
從上面的輸出順序可以看出,先是啟動(dòng)了main線程,然后再啟動(dòng)了MyThread線程,在MyThread線程中,又啟動(dòng)了MyThread1線程。但是由于讓MyThread1線程睡了1秒,模擬處理后續(xù)業(yè)務(wù),這樣他就比MyThread運(yùn)行完畢的時(shí)間晚一些。
現(xiàn)在,在代碼中加上CountDownLatch ,要讓MyThread1先運(yùn)行完畢,再讓MyThread繼續(xù)運(yùn)行。
1 package code; 2 3 import java.util.concurrent.CountDownLatch; 4 5 public class MyThread extends Thread { 6 CountDownLatch countDownLatch = new CountDownLatch(1); 7 public static void main(String[] args) { 8 MyThread th = new MyThread(); 9 Thread t1 = new Thread(th, "Mythread"); 10 t1.start(); 11 System.out.println(Thread.currentThread().getName()); 12 } 13 public void run() 14 { 15 Mythread1 th2 = new Mythread1(); 16 Thread t2 = new Thread(th2, "Mythread1"); 17 t2.start(); 18 try { 19 countDownLatch.await(); 20 } catch (InterruptedException e) { 21 e.printStackTrace(); 22 } 23 System.out.println(this.currentThread().getName()); 24 } 25 class Mythread1 extends Thread 26 { 27 public void run() { 28 try { 29 Thread.sleep(1000); 30 } catch (InterruptedException e) { 31 e.printStackTrace(); 32 } 33 System.out.println(this.currentThread().getName()); 34 countDownLatch.countDown(); 35 } 36 37 } 38 }代碼寫法如上所示,大致分三步
1,我們先new一個(gè)CountDownLatch對(duì)象入?yún)⒃O(shè)置為1(我個(gè)人理解的這個(gè)就像是new一個(gè)數(shù)組一樣,什么時(shí)候數(shù)組清空了,那就可以讓被中斷的線程繼續(xù)運(yùn)行了)
2,在MyThread類中調(diào)用countDownLatch.await();讓當(dāng)前線程停止運(yùn)行。
3,在Mythread1類中調(diào)用countDownLatch.countDown()方法。當(dāng)Mythread1全部執(zhí)行完畢,再最后調(diào)用該方法,作用就是把我說的“數(shù)組”清空。
看看輸出的打印結(jié)果
結(jié)果如上圖,是符合預(yù)期的結(jié)果的。
最后再說下CountDownLatch countDownLatch = new CountDownLatch(1)的入?yún)?#xff0c;這塊設(shè)置的是1,那就需要調(diào)用一次countDownLatch.countDown()減去1。
如果是其他數(shù)字,那就要調(diào)用相應(yīng)的次數(shù),否則調(diào)用countDownLatch.await()的線程都不會(huì)被繼續(xù)執(zhí)行。
?
轉(zhuǎn)載于:https://www.cnblogs.com/JJJ1990/p/8328319.html
總結(jié)
以上是生活随笔為你收集整理的JAVA多线程之CountDownLatch的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈谈我对Promise的理解
- 下一篇: 动态规划-----------01背包,