CountDownLatch 和 CyclicBarrier
一. CountDownLatch 的介绍
CountDownLatch 主要用于一个或多个线程等待其他线程完成操作。平常如果使用 new Thread()
开启多个线程,一般会使用 join()
来等待线程完成,但是如果开启的线程太多,或者是直接使用线程池里面的线程就不能再用这种方法,所以就使用 CountDownLatch 来对完成的线程计数,等待所有线程都完成,CountDownLatch 的计数器就为 0,所有任务就完成了。
1. CountDownLatch 的使用
CountDownLatch 使用方法就只需要实例一个对象,如果有 N 个线程,构造函数就传入 N 就行。然后每个线程运行过程的最后使用 countDown()
将计数减 1,最后使用 await()
等待计数为 0,就相当于所有线程都完成了。
public class ThreadTest {
private static final ReentrantLock lock = new ReentrantLock();
private static final CountDownLatch latch = new CountDownLatch(2);
private int num = 0;
public int getNum() {
return num;
}
private void count() {
lock.lock();
try {
for (int i = 0; i < 100000; i++) {
num+=1;
}
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
ThreadTest lockTest = new ThreadTest();
Thread thread1 = new Thread(() -> {
lockTest.count();
latch.countDown();
});
Thread thread2 = new Thread(() -> {
lockTest.count();
latch.countDown();<