CountDownLatch,CyclicBarrier,Semaphore
CountDownLatch 的await可以阻塞一个线程,等待全部countdown完毕,则跳过wait
CyclicBarrier 阻塞多个线程,执行完毕后返回自身runnable
Semaphore 信号量通过信号量阻塞多个线程,等待已经获取信号的线程释放线程后,其他线程才可以获取,以及执行
使用方式
```
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
final int value = i;
new Thread(() -> {
System.out.println("很开心" + value);
countDownLatch.countDown();
}).start();
}
countDownLatch.await();
System.out.println("countDownLatch 完毕");
<pre><code> CyclicBarrier cyclicBarrier = new CyclicBarrier(5, () -> {
System.out.println("cyclicBarrier 收集完毕");
});
for (int i = 0; i < 5; i++) {
final int value = i;
new Thread(() -> {
System.out.println("很开心" + value);
try {
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName() + "我完成了");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
Semaphore semaphore = new Semaphore(4);
for (int i = 0; i < 5; i++) {
new Thread(() -> {
try {
semaphore.acquire(2);
System.out.println(Thread.currentThread().getName() + "爷来了");
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "活干完了");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(2);
}
}).start();
}
}
}
结果
```java
很开�?2
很开�?4
很开�?0
很开�?3
很开�?1
countDownLatch 完毕
很开�?0
很开�?1
很开�?3
很开�?4
很开�?2
cyclicBarrier 收集完毕
Thread-7我完成了
Thread-5我完成了
Thread-8我完成了
Thread-6我完成了
Thread-9我完成了
Thread-10爷来�?
Thread-12爷来�?
Thread-10活干完了
Thread-12活干完了
Thread-13爷来�?
Thread-11爷来�?
Thread-13活干完了
Thread-11活干完了
Thread-14爷来�?
Thread-14活干完了
```</code></pre><p style=""></p>
评论区