public static void main(String[] args) throws InterruptedException {
// Runtime.getRuntime().availableProcessors() 获取可用的cpu数量
int count = Runtime.getRuntime().availableProcessors();
//创建一个指定线程数量的线程池
ExecutorService executorService = Executors.newFixedThreadPool(count);
/**
* CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。
* 每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,
* 它表示所有的线程已经完成了任务
*/
CountDownLatch downLatch = new CountDownLatch(count);
for (int i = 0; i <count ; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
downLatch.countDown();//计数器减 1
}
});
}
/**
* 如果计数器不为0的话 , 主线程会进入阻塞状态
* timeout : 5 表示最大超时时间
* TimeUnit.SECONDS 表示以秒为单位计算的
* 返回值 , 如果downLatch 计数器不为0的话,就是false ,反之true
* 它还有一个无参的 downLatch.await(),如果计数器不为0 , 会一直阻塞 , 没有超时时间
*/
boolean await = downLatch.await(5, TimeUnit.SECONDS);
System.out.println(await);
//downLatch.getCount() 获取剩余的数量
System.out.println(downLatch.getCount());
System.out.println("主线程执行:=>"+Thread.currentThread().getName());
}