多线程工具类 |
1、CountDownLatch (倒计时锁存器)
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待
代码示例:使一个线程等待其他线程各自执行完毕后再执行
public class Demo{
public static void main(String[] args) throws InterruptedException{
CountDownLatch cdl = new CountDownLatch(3);
for(int i = 1;i<=3;i++){
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"出门");
cdl.countDown(); // 计数器-1
}).start();
}
cdl.await();//主线程等待计数器归0
System.out.println("关门");
}
}
2、CyclicBarrier (循环壁障)
个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
代码示例:让所有线程都等待完成后才会继续下一步行动
public class Demo{
public static void main(String[] args){
CyclicBarrier cb=new CyclicBarrier(7,()->{
System.out.println("集合7颗龙珠,召唤神龙") //阻塞的线程达到7后执行的线程。
});
for(int i = 1;i <= 7;i++){
final int temp = i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"找到第"+i+"龙珠")
try {
cyclicBarrier.await(); //阻塞当前线程
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
3、semaphore (信号量)
一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个acquire() ,然后再获取该许可。每个release() 添加一个许可,从而可能释放一个正在阻塞的获取者
代码示例:限制线程并发的数量
public class Demo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(4);
for (int i = 1; i <= 6; 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();
}
}, String.valueOf(i)).start();
}
}
}