/**
* 有4个线程分别获取C、D、E、F盘的大小,第5个线程统计总大小
*/
public class Question_01 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(4);
DiskMemory diskMemory = new DiskMemory();
CountDownLatch countDownLatch = new CountDownLatch(4);
for (int i = 0; i < 4; i++) {
executorService.execute(() -> {
try {
int size = diskMemory.getSize();
diskMemory.setSize(size);
Thread.sleep(1000);
System.out.println("线程执行,磁盘大小:" + size);
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown();
System.out.println("--------");
});
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("磁盘总大小:" + diskMemory.getTotalSize());
//线程池使用完需要手动关闭
executorService.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;
}
}
//输出结果:
线程执行,磁盘大小:200
线程执行,磁盘大小:200
--------
线程执行,磁盘大小:200
--------
线程执行,磁盘大小:100
--------
磁盘总大小:700
--------
countDownLatch.countDown();//将最初初始化的计数减1
countDownLatch.await();//线程将一直阻塞,知道计数减为0
如果线程执行完,不关闭线程池,程序将一直运行。
所以最后输出的System.out.println("--------");有可能在主线程输出之前,也可能在之后。