主要用到的方法是:CountDownLatch,
CountDownLatch類是一個(gè)同步倒數(shù)計(jì)數(shù)器,構(gòu)造時(shí)傳入int參數(shù),
該參數(shù)就是計(jì)數(shù)器的初始值,
每調(diào)用一次countDown()方法,計(jì)數(shù)器減1,計(jì)數(shù)器大于0 時(shí),
await()方法會(huì)阻塞后面程序執(zhí)行,直到計(jì)數(shù)器為0,后面被阻塞的方法才會(huì)得以實(shí)行。
await(long timeout, TimeUnitunit),是等待一定時(shí)間,然后執(zhí)行,
不管計(jì)數(shù)器是否到0了。
ublic static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(4);
ExecutorService service = Executors.newFixedThreadPool(6);
DiskMemory diskMemory = new DiskMemory();
for (int i = 0; i < 4; i++) {
service.execute(new Runnable() {
@Override
public void run() {
int timer = new Random().nextInt(5);
try {
Thread.sleep(timer * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int diskSize = diskMemory.getSize();
System.out.printf("完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)%d秒. 磁盤大小為%d.\n", timer, diskSize);
diskMemory.setSize(diskSize);
// 任務(wù)完成之后,計(jì)數(shù)器減一
countDownLatch.countDown();
System.out.println("count num = " + countDownLatch.getCount());
}
});
}
// 主線程一直被阻塞,直到count的計(jì)數(shù)器被置為0
countDownLatch.await();
System.out.printf("全部磁盤都統(tǒng)計(jì)完成,所有磁盤總大小.\n" + ", totalSize = " + diskMemory.getTotalSize());
service.shutdown();
}
public class DiskMemory {
private int totalSize ;
public int getSize(){
return (new Random().nextInt(3)+1)*100;//加一是為了防止獲取磁盤大小為0,不符合常理
}
public void setSize(int size){
totalSize += size;
}
public int getTotalSize(){
return totalSize;
}
}
輸出:(count順序不保證)
完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)0秒. 磁盤大小為300.
count num = 3
完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)2秒. 磁盤大小為100.
count num = 2
完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)2秒. 磁盤大小為300.
count num = 1
完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)2秒. 磁盤大小為300.
count num = 0
全部磁盤都統(tǒng)計(jì)完成,所有磁盤總大小 = 1000