前序:
上周測試給開發的同事所開發的模塊提出了一個bug,并且還是偶現。
經過仔細查看代碼,發現是在業務中啟用了多線程,2個線程同時跑,但是新啟動的2個線程必須保證一個完成之后另一個再繼續運行,才能消除bug。
什么時候用?
多線程是在很多地方都會用到的,但是我們如果想要實現在某個特定的線程運行完之后,再啟動另外一個線程呢,這個時候CountDownLatch就可以派上用場了
怎么用?
先看看普通的多線程代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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類內部又寫了一個MyThread1類,同樣也是繼承了Thread類,并且在run方法里面讓它睡1秒,這樣運行代碼,就會打印出:
從上面的輸出順序可以看出,先是啟動了main線程,然后再啟動了MyThread線程,在MyThread線程中,又啟動了MyThread1線程。但是由于讓MyThread1線程睡了1秒,模擬處理后續業務,這樣他就比MyThread運行完畢的時間晚一些。
現在,在代碼中加上CountDownLatch ,要讓MyThread1先運行完畢,再讓MyThread繼續運行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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對象入參設置為1(我個人理解的這個就像是new一個數組一樣,什么時候數組清空了,那就可以讓被中斷的線程繼續運行了)
2、在MyThread類中調用countDownLatch.await();讓當前線程停止運行。
3、在Mythread1類中調用countDownLatch.countDown()方法。當Mythread1全部執行完畢,再最后調用該方法,作用就是把我說的“數組”清空。
看看輸出的打印結果
結果如上圖,是符合預期的結果的。
最后再說下CountDownLatch countDownLatch = new CountDownLatch(1)的入參,這塊設置的是1,那就需要調用一次countDownLatch.countDown()減去1。
如果是其他數字,那就要調用相應的次數,否則調用countDownLatch.await()的線程都不會被繼續執行。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/JJJ1990/p/8328319.html