分别是juc并发包下的三个辅助类
闭锁:countDownLatch 相当于一个减法计数器
栅栏:cyclicBarrier 相当于一个栅栏,没有多少个线程到达时栅栏不会打开,达到以后才会打开 加法计数器
信号量:semaphore 可以用来限流等操作
countDownLatch简单使用:
CountDownLatch countDownLatch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
new Thread(()->{
System.out.println("线程"+Thread.currentThread().getName()+"出锁");
countDownLatch.countDown();//每个线程执行就-1
},i+"").start();
}
try {
countDownLatch.await();//次数为0时就执行下边的操作
System.out.println("关锁");
} catch (InterruptedException e) {
e.printStackTrace();
}
cyclicBarrier使用:
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
System.out.println("开始上课");//当有五个线程调用await方法时会执行这个方法
});
for (int i = 0; i < 5; i++) {
final int t = i;
new Thread(()->{
System.out.println("线程"+Thread.currentThread().getName()+"进入班级");
try {
cyclicBarrier.await();//每次加1
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},t+"").start();
}
semaphore使用:
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 6; i++) {
final int t = i;
new Thread(()->{
try {
semaphore.acquire();//获取信号量标识
System.out.println("线程"+Thread.currentThread().getName()+"获取到信号量");
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
System.out.println("线程"+Thread.currentThread().getName()+"释放信号量");
}
},t+"").start();
}