深入理解JUC:第四章:CountDownLatch倒計(jì)時(shí)器
理論:
CountDownLatch是一個(gè)非常實(shí)用的多線程控制工具類。常用的就下面幾個(gè)方法:
CountDownLatch(int count) //實(shí)例化一個(gè)倒計(jì)數(shù)器,count指定計(jì)數(shù)個(gè)數(shù)
countDown() // 計(jì)數(shù)減一
await() //等待,當(dāng)計(jì)數(shù)減到0時(shí),所有線程并行執(zhí)行
未使用CountDownLatch的代碼:
public class Demo {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 工作任務(wù)完成,離開(kāi)公司");
},String.valueOf(i)).start();
}
System.out.println(Thread.currentThread().getName()+"\t 最后將公司門鎖死,離開(kāi)公司");
}
}
控制臺(tái):
使用CountDownLatch的代碼:
public class Demo {
public static void main(String[] args) throws Exception{
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 工作任務(wù)完成,離開(kāi)公司");
countDownLatch.countDown();
},String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName()+"\t 最后將公司門鎖死,離開(kāi)公司");
}
}
控制臺(tái):
案例二:
package tst.project;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
int tasks = 3;
final CountDownLatch latch = new CountDownLatch(tasks);
ExecutorService executorService = Executors.newFixedThreadPool(tasks);
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("5秒完成:"+latch);
latch.countDown();
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("3秒完成:"+latch);
latch.countDown();
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1秒完成:"+latch);
latch.countDown();
}
});
executorService.shutdown();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
控制臺(tái):
結(jié)合下一章閱讀:https://blog.csdn.net/java_wxid/article/details/99170471