package Thread;
import java.util.concurrent.CountDownLatch;
/*
* countDownLatch---闭锁--(计数减计时器)--不可复用
* (1.5以后开始并发包中提供,并发编程类)
* 这个类能够使一个线程等待其他线程完成各自的工作后再执行
* (守护线程是等待其他线程结束(完成后)自己再结束)
* Demo:五个检测线程执行完毕后再执行输出系统正常
*
* 在其他线程上加锁,然后等到这些线程都执行完毕后,我们将锁打开程序向下运行
*
* 备注:刚我出了一个bug,线程执行完毕之后一直再等输出系统正常,找了一下是锁初值设置为10了。。。
* 所以这块的话一定要对应好线程数。。要不这个计数器会一直等下去。。
*/
public class Demo7 {
//闭锁对象的创建
static CountDownLatch countDownLatch=new CountDownLatch(5);
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread thread=new Thread() {
public void run() {
System.out.println(this.getName()+"正在检测");
countDownLatch.countDown();//计数减一
};
};
thread.start();
}
//等待其他线程结束后通知其他线程可以开始执行
try {
//阻塞方法(因为一直在等待)
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("系统正常");
}
}
package Thread;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/*
* demo:赛跑案例 每个参赛选手都代表一个进程 进程里面有两个部分
* 一个是准备一个是起跑 五个人都准备好 才能起跑
*
* 个人目前理解:闭锁用于线程与另外事件的隔离,达到条件 执行另外事件
* 栅栏用于线程组内部之间的协调 线程组内部达到某一条件,每个线程再继续向下走
* 栅栏:
* 栅栏类似于闭锁,但是他加在线程中间 或者一组动作之间
* 栅栏和闭锁的用法的共同点 都有await方法 用于通知
*
* 区别是栅栏没有计数减的方法
* 在什么地方技术减,就在什么地方await.
* 而且栅栏是计数加的过程 是反复加 比如下面的demo 只要加到5 那么栅栏会从0重新开始加
* 闭锁是一组线程全部结束完,程序往下走,走另外事件了
* 闭锁是计数减的过程,当减到0以后,闭锁将会一直打开
* 但是栅栏是,我们都到我们自己任务里的一步了,就等你呢兄弟,兄弟们都到全了,ok,咱们继续把事做完
*
* 使用上闭锁和栅栏有相同的功能 但是栅栏可以复用 会循环计数 而闭锁打开以后就永远打开了
* (如果这个赛跑案例使用闭锁的话 我们将起跑可以设置成为另外一个线程,5人准备好,闭锁打开,开始起跑线程,但是不能复用)
*/
public class Demo8 {
//创建栅栏
static CyclicBarrier cyclicBarrier=new CyclicBarrier(5);
//栅栏的另一种构造方法 当我们冲破栅栏的界限,我们优先执行后面的线程
static CyclicBarrier cyclicBarrier2=new CyclicBarrier(5, new Thread() {public void run() {};});
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread thread=new Thread(){
@Override
public void run() {
System.out.println(this.getName()+"准备好");
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("跑");
}
};
thread.start();
}
}
}
/*---输出更加便于理解
Thread-0准备好
Thread-1准备好
Thread-2准备好
Thread-3准备好
Thread-4准备好
跑
跑
跑
跑
跑
Thread-5准备好
Thread-6准备好
Thread-7准备好
Thread-8准备好
Thread-9准备好
跑
跑
跑
跑
跑
如果我们是12个线程需要运行(12个选手--那么最后一组只有两个选手
一直不满足栅栏的条件 一直不会起跑)
*/