一、CountDownLath
- 名称:减法计数器
- 使用场景:指定个数线程执行完毕再执行后续操作
- 原理:设定计数器其实值,每个线程完成任务后,执行countDownLath.countDown();使得计数器计数-1.当计数器计数为0时,执行后续代码。
- 示例代码:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) {
//创建减法计数器
CountDownLatch countDownLath =new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
new Thread(()->{
System.out.println("go");
countDownLath.countDown();
try {
//当计数器等到自己为0时,执行后续代码
countDownLath.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程后续代码");
//线程完成任务后,计数器-1
}).start();
}
try {
//当计数器等到自己为0时,执行后续代码
countDownLath.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main线程后续代码");
}
}
- 执行结果:
注意:如果计数器没有到0,后续代码是不会执行的。
二、CyclicBarrier
- 名称:加法计数器
- 使用场景:指定个数线程执行cyclicBarrier.await()后执行特定操作以及后续代码
- 示例代码:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
//设定个数,当达到个数的线程在等待时,执行后续代码
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
System.out.println("特定代码");
});
for (int i = 0; i < 4; i++) {
new Thread(()->{
System.out.println("go");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("线程后续代码");
}).start();
}
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("main线程后续代码");
}
- 执行结果:
注意:加法和减法计数器,逻辑上差不多。加法器没有+的操作。执行cyclicBarrier.await()的线程达到目标数目后,就会执行特定代码和后续代码。
三、Semaphore
- 名称:信(许可证)
- 使用场景:只有获得许可证的线程,才能进行。semaphore.acquire():获得许可证,semaphore.release():释放许可证。限制线程数。
- 示例代码:
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
public static void main(String[] args) {
// 许可证,数量
Semaphore semaphore = new Semaphore(2);
for (int i = 0; i <= 3; i++) {
new Thread(()->{
// acquire() 得到
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"抢到许可证");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println(Thread.currentThread().getName()+"释放许可证");
semaphore.release();
}
// release() 释放
},String.valueOf(i)).start();
}
}
}
- 运行结果:
如果有帮助记得点赞关注哈!一起进步!!!!!