CountDownLatch
定义:让一些线程阻塞直到另一些线程完成一些列操作之后才被唤醒。
即使门闩的意思,给定一个数,当这个数被减到0时才能开始运行另一个线程。
主要有两个方法一个是await方法等待,一个是countDown方法让门闩减一。
可以简单理解为:
从自助餐拿的吃的必须吃完才会开门放人离开,不然打断腿。
代码:假如拿了5个蛋糕,必须吃完才可以走。
/***
* CountDownLatch 的使用. 自助餐拿的5个蛋糕吃完才能走,不然打断腿
*/
public class CountDownLatchDemo {
static CountDownLatch countDownLatch = new CountDownLatch(5);
public static void main(String[] args) throws InterruptedException {
for (int i = 1; i<= 5; i++) {
final int temp = i;
new Thread(()->{
System.out.println(Thread.currentThread().getName() + "\t" + "蛋糕"+ temp + "号已吃完");
countDownLatch.countDown();
},String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println("蛋糕吃完了 开门放人");
}
}
输出结果:
2、CyclicBarrier的字面意思是循环使用屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。
和CountDownLatch相反,这个是加法,而countdownLatch是减法。
几个简单例子: 集齐七颗龙珠才能召唤神龙
实例代码:
/***
* 跟CountDownLatch相反 集齐七颗龙珠才能召唤神龙
*/
public class CyclicBarrierDemo {
static CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("召唤神龙");
});
public static void main(String[] args) {
for (int i = 1; i<8 ; i++) {
final int temp =i;
new Thread(()->{
System.out.println(Thread.currentThread().getName() + "\t" + temp+"号龙珠已拿到");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
输出结果:
3、Semaphore
信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。
简单的说就是抢车位,10个人来抢5个车位。
很重要的一个,经常会用到。
/****
* semaphore 信号量 .相当于抢车位,有限的车位如果满了必须要有车离开之后才能继续进
*/
public class SemaphoreDemo {
static Semaphore semaphore = new Semaphore(5);
public static void main(String[] args) {
for (int i = 1; i<=10; i++) {
final int temp=i;
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"\t"+temp+"抢到了车位");
try {
TimeUnit.SECONDS.sleep(3);
System.out.println("三秒之后"+Thread.currentThread().getName()+"释放锁");
}catch (InterruptedException e) {
e.printStackTrace();
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}
输出结果: