java 并发辅助类
2022-12-15 本文已影响0人
arkliu
CountDownLatch(减法计数器)
CountDownLatch是一个同步工具类,用来协调多个线程之间的同步
CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
// 初始化一个计数器为5
CountDownLatch latch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" runs..");
latch.countDown(); // 计数减1
},"线程"+i).start();
}
latch.await(); // 阻塞等待计数为0,才会继续向后执行
System.out.println("countdown num is 0...");
CountDownLatch缺点:
CountDownLatch是一次性的,计算器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用
CyclicBarrier
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->{
System.out.println("7个线程都执行完了...");
});
for (int i = 0; i < 7; i++) {
final int tmp = i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" get..."+tmp);
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
},"线程"+i).start();
}

Semaphore信号量
作用:多个共享资源互斥使用,控制最大线程数
- semaphore.acquire(); //得到,如果已经满了,则等待被释放为止
- semaphore.release(); // 释放,会将当前的信号量释放
// 3个停车位
Semaphore semaphore = new Semaphore(3);
// 6个线程
for (int i = 0; i < 6; i++) {
final int tmp = i;
new Thread(()->{
try {
semaphore.acquire(); //得到
System.out.println(Thread.currentThread().getName()+" 找到了车位");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName()+" 离开了车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放
}
},"线程"+i).start();
}
