一、CountDownLatch
CountDownLatch是一个减法计数器,允许一个或多个线程等直到在其他线程中执行的一组操作完成的同辅助。
每次有线程调用countDown()时数量 -1 ,countDownLatch.await()就会被唤醒,继续执行
常用方法:
countDownLatch.countDown() // 相当于-1操作
ountDownLatch.await(); //等待计数器归零,然后向下执行
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
//有必须要执行的任务的时候再使用
CountDownLatch countDownLatch = new CountDownLatch(5);
//countDownLatch.countDown(); // -1
for (int i = 1; i <= 5; i++) {
new Thread(()->{
countDownLatch.countDown();
System.out.println(Thread.currentThread().getName()+"Go!");
},String.valueOf(i)).start();
}
countDownLatch.await(); //等待计数器归零,然后向下执行
System.out.println("某行为");
}
}
二、CyclicBarrier
CyclicBarrier是一个加法计数器,允许一组线程全部等待彼此达到共同屏障点的同步辅助。
在new一个CyclicBarrier对象时,参数可以传一个int型,也可以传一个int型加一个Runnable接口。
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{});
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
System.out.println("进度条100%");
});
for (int i = 1; i <= 5; i++) {
final int temp = i;
//lambda不能拿到i
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"Loading..."+temp);
try {
cyclicBarrier.await();//等待
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
三、Semaphore
作用:多个共享资源的互斥使用;限流
//参数填默认线程数量
Semaphore semaphore = new Semaphore(5);
//获得,如果信号量已经满了,等待被释放为止
semaphore.acquire();
//释放,将当前的信号量释放,唤醒等待的线程
semaphore.release();
场景:抢车位 6辆车三个车位
public class SemaphoreDemo {
public static void main(String[] args) {
//参数:线程数量 --- > 停车位
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 6; i++) {
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"Park!");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName()+"Leave!");
} catch (InterruptedException e) {
}finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}