1. CountDownLatch
减法计数器 使一个线程等待其他线程各自执行完毕后再执行
- 指定一个计数器(计数6)new CountDownLatch(6)
- 每有一个线程执行就减一 countDownLatch.countDown();
- 当计数器归零后,唤醒所有await线程
class Driver {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i=1;i<7;i++)
{
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"go out");
countDownLatch.countDown();
},String.valueOf(i)).start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("close door");
}
}
2. CyclicBarrier
加法计数器 允许一组线程全部等待彼此达到共同屏障点
- 指定一个加法计数器 CyclicBarrier cyclicBarrier = new CyclicBarrier(int,Runnalbe);
int == 共同屏障点(计数目标) Runnable == 到达屏障点后执行的线程操作
-
让一组线程等待 cyclicBarrier.await();
-
到达计数器数量int后,执行Runable
class Driver2 {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("集齐龙珠,召唤神龙");
});
for (int i=1;i<=7;i++)
{
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"星龙珠,get");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
1星龙珠,get
4星龙珠,get
6星龙珠,get
5星龙珠,get
2星龙珠,get
3星龙珠,get
7星龙珠,get
集齐龙珠,召唤神龙
3. Semaphore
一个计数信号量 控制线程执行的数量
- 创建一个信号量 Semaphore semaphore = new Semaphore(3); 3代表允许执行的线程数量
- 获得 semaphore.acquire();
- 释放 semaphore.release();
class Driver3{
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i=0;i<7;i++){
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"come");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName()+"out");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}