2020年6月24日 作者 zeroheart

CountDownLatch,CyclicBarrier,Semaphore

参考这篇
https://mp.weixin.qq.com/s/TDw7GnzDw5FK3RWwkIzzZA

总结一下

CountDownLatch是一个线程等其他线程,CyclicBarrier是多个线程间相互等待

CountDownLatch,每次-1,直到0,CyclicBarrier每次加1,直到固定值

CountDownLatch只能单次使用,CyclicBarrier可以循环使用

CyclicBarrier 可以在最后一个线程达到屏障之前,选择先执行一个操作。

Semaphore,拿到许可的可以执行,可以设置是否公平

下面,给个semaphore的例子

public class SemaphoreTest {
private static int count = 20;

public static void main(String[] args) {

ExecutorService executorService = Executors.newFixedThreadPool(count);

//指定最多只能有五个线程同时执行
Semaphore semaphore = new Semaphore(5, true);

Random random = new Random();
for (int i = 0; i < count; i++) {
final int no = i;
executorService.execute(new Runnable() {
@Override
public void run() {
try {
//获得许可
semaphore.acquire();
System.out.println(no +":号车可通行");
//模拟车辆通行耗时
Thread.sleep(random.nextInt(2000));
//释放许可
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}

executorService.shutdown();

}
}
指定同时可以获得锁的个数,和是否使用公平锁。执行完了,在释放即可。