Java基础--CountDownLatch
2024-09-04 01:38:24
CountDownLatch是线程同步辅助类,它允许一个或多个线程wait直到countdown被调用使count为0。
CountDownLatch是在java1.5被引入,存在于java.util.concurrent包下。
常用于
1:用于在一个线程中等待N个线程完成
2:让N个子线程同时开始run
方法:
CountDownLatch(int count) 构造器,初始化次数
void await() throws InterruptedException 使一个线程wait,直到count为0
boolean await(long timeout, TimeUnit unit) 使一个线程wait,直到count为0或等待时间timeout
void countDown() count减一
long getCount() 返回当前count
String toString() 返回当前对象及当前count
例子:
-----------------
class Driver {
void main() throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1); // 使线程同时开始
CountDownLatch doneSignal = new CountDownLatch(10); // 全部结束 // create and start threads
for (int i = 0; i < 10; ++i) {
new Thread(new Worker(startSignal, doneSignal)).start();
} // let all threads proceed
startSignal.countDown(); // wait for all to finish
doneSignal.await();
}
} class Worker implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal; Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
} public void run() {
try {
//wait the start signal
startSignal.await();
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {
}
} void doWork() {
}
}
-----------------
实现:
AQS静态内部类实现的同步控制
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L; Sync(int count) {
setState(count);
} int getCount() {
return getState();
} protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
} protected boolean tryReleaseShared(int releases) {
// Decrement count; signal when transition to zero
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
}
end
最新文章
- 空MVC项目找不到System.Web.Optimization的处理办法
- RedHat Enterprise Linux 7关闭防火墙方法
- 没人告诉你关于z-index的一些事
- 从Spring容器中获取Bean。ApplicationContextAware
- 数据库 —— Access 数据库
- 关于PHP高并发抢购系统设计
- Win10下C:\Users\John以账户名称命名的系统文件夹用户名的修改
- js禁止开发者工具
- Java开发笔记(八十二)注解的基本单元——元注解
- xterm配置
- 16. 3Sum Closest (JAVA)
- How to enable mp3 on Ubuntu
- ArcGIS for qml -添加自由文本
- SpringBoot mybatis配置
- 小米手机安装mitmproxy证书
- Android7.0 Doze模式分析(一)Doze介绍 &;amp; DeviceIdleController
- jconsole连接远程Tomcat应用
- Kafka 接受数据并消费到hbase数据库
- python 面向对象(进阶篇)转载武沛齐
- 挖一挖unsigned int和补码