闭锁,当所有的线程执行完成后在执行某些操作,相当于计数器
由于主线程完成了其他线程的创建后会继续向下执行,所以该方法不能够计算所有线程完成的总时间
/**
* 无法计算所有线程需要的时间
*/
@Test
public void test(){
Instant instant=Instant.now();
for (int i = 0; i < 5; i++) {
new Thread(()->{
for (int i1 = 0; i1 < 5000; i1++) {
System.out.println(i1);
}
}).start();
}
System.out.println(Instant.now().toEpochMilli()-instant.toEpochMilli());
}
@Test
public void countDownLatch(){
CountDownLatch latch=new CountDownLatch(5);//参数为线程数
MyRunnable myRunnable = new MyRunnable(latch);
Instant instant=Instant.now();
for (int i = 0; i < 5; i++) {
new Thread(myRunnable).start();
}
try {
latch.await();//等待
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Instant.now().toEpochMilli()-instant.toEpochMilli());
}
class MyRunnable implements Runnable{
CountDownLatch countDownLatch;
MyRunnable(CountDownLatch countDownLatch){
this.countDownLatch=countDownLatch;
}
@Override
public void run() {
{
try {
for (int i = 0; i < 500000; i++) {
if(i%2==0){
System.out.println(Thread.currentThread().getName()+"=====" + i);
}
}
}catch (Exception e){
}finally {
countDownLatch.countDown();//结束计数器减一
}
}
}
}