您好,登錄后才能下訂單哦!
本篇文章為大家展示了CountDownLatch怎么在JAVA中使用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
什么時(shí)候用?
多線程是在很多地方都會(huì)用到的,但是我們?nèi)绻胍獙?shí)現(xiàn)在某個(gè)特定的線程運(yùn)行完之后,再啟動(dòng)另外一個(gè)線程呢,這個(gè)時(shí)候CountDownLatch就可以派上用場(chǎng)了
怎么用?
先看看普通的多線程代碼:
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 th3 = new Mythread1(); Thread t2 = new Thread(th3, "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)部又寫了一個(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)行。
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 th3 = new Mythread1(); Thread t2 = new Thread(th3, "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一個(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)ⅲ@塊設(shè)置的是1,那就需要調(diào)用一次countDownLatch.countDown()減去1。
如果是其他數(shù)字,那就要調(diào)用相應(yīng)的次數(shù),否則調(diào)用countDownLatch.await()的線程都不會(huì)被繼續(xù)執(zhí)行。
上述內(nèi)容就是CountDownLatch怎么在JAVA中使用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。