- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AbstractQueuedSynchronizer详解(二)——CountDownLatch源码分析
AbstractQueuedSynchronizer详解(二)——CountDownLatch源码分析
CountDownLatch的使用
CountDownLatch是一个工具类,用于使一个或多个线程等待另一系列线程完成操作,也就是说一些线程在另外一些完成之后才能继续执行,类似线性。
初始CountDownLatch时需要提供一个count参数,await方法将会使线程阻塞,直到这个值变为0,countDown()方法可以使count值减1,一旦到达0后,调用await阻塞的线程将会得到释放。
CountDown一般有两个用法。
一个线程等待多个线程
一个线程等待多个线程完成后再执行,比如一个不限时的考试,10个学生考试,交卷时间不同,当10个学生都交卷后,老师才认为考试结束。下面是该例子:
public class ExamDemo {
public static class Student implements Runnable {
private int num;//学号
private CountDownLatch countDownLatch;
public Student(int num, CountDownLatch countDownLatch) {
this.num = um;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
Random random = new Random();
try {
TimeUnit.SECONDS.sleep(random.nextInt(10) + 1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(学生 + num + 交卷了);
//完成工作,将count-1
countDownLatch.countDown();
}
}
public static class Teacher implements Runnable {
private CountDownLatch countDownLatch;
public Teacher(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
System.out.println(考试开始,不限时间!);
try {
//等待count变为0
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(考试结束);
}
}
public static void main(String[] args) {
Executor executor = Executors.newCachedThreadPool();
CountDownLatch countDownLatch = new CountDownLatch(10);
executor.execute(new Teacher(countDownLatch));
for (int i = 1; i = 10; i++)
executor.execute(new Student(i, countDownLatch));
}
}
多个线程等待一个线程
再举个例子,比如几个司机在等红灯,而一旦变成了绿灯,几个司机就可以都通过了。
public class
文档评论(0)