CountDownLatch是什么
countDownLatch 可以实现一个或者多个线程等待,直到其他线程中的一组操作完成的同步。countDownLatch 在初始化的时候。设定一个值,该值为0以后,释放被await阻塞的线程,这个值无法被重置。一个countDownLatch可以由一个线程阻塞多个线程,也可以由多个线程阻塞一个线程。
CountDownLatch基本方法
await方法:包含两种多态,1种是没有入参,直接将当前线程阻塞到计数器归零,或者线程被interrupted;另外一种是带有两个入参的,通过设置一个阻塞的时长,在线程被阻塞到计数器归零,或者等待的指定时间过去。
countDown方法:减少计数器的值。如果计数器归零,释放所有等待的线程。如果当前计数大于零,则它将递减。 如果新计数为零,则所有等待的线程都将被重新启用以进行线程调度。
countDownLatch用法示例
1 Thread[] threads = new Thread[100]; 2 CountDownLatch latch = new CountDownLatch(threads.length); 3 for (int i = 0; i < threads.length; i++) { 4 threads[i] = new Thread(()->{ 5 int result = 0; 6 for (int j = 0; j < 10000; j++) { 7 result +=j; 8 } 9 latch.countDown(); 10 }); 11 } 12 13 for (int i = 0; i < threads.length; i++) { 14 threads[i].start(); 15 } 16 try { 17 latch.await(); 18 } catch (Exception e) { 19 e.printStackTrace(); 20 } 21 System.out.println("end latch"); 22
countDownLatch 与join的区别
countDownLatch 与join的功能类似,不同之处在于:join必须等到线程全部结束后,才能调起被阻塞的线程。而countDownLatch不需要等到线程结束,只需要执行过countDown方法后,就会将计数器减1,降到0以后,被阻塞线程即可运行。countDownLatch比join线程更加灵活。