并发工具类(一)等待多线程完成的CountDownLatch
来源:互联网 发布:java中实例化是什么 编辑:程序博客网 时间:2024/05/18 13:26
简介
CountDownLatch 允许一个或多个线程等待其他线程完成操作。
应用场景
假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用join。代码如下:
01
public
class
JoinCountDownLatchTest {
02
03
public
static
void
main(String[] args)
throws
InterruptedException {
04
Thread parser1 =
new
Thread(
new
Runnable() {
05
@Override
06
public
void
run() {
07
}
08
});
09
10
Thread parser2 =
new
Thread(
new
Runnable() {
11
@Override
12
public
void
run() {
13
System.out.println(
"parser2 finish"
);
14
}
15
});
16
17
parser1.start();
18
parser2.start();
19
parser1.join();
20
parser2.join();
21
System.out.println(
"all parser finish"
);
22
}
23
24
}
join用于让当前执行线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远wait,代码片段如下,wait(0)表示永远等待下去。
1
while
(isAlive()) {
2
wait(
0
);
3
}
直到join线程中止后,线程的this.notifyAll会被调用,调用notifyAll是在JVM里实现的,所以JDK里看不到,有兴趣的同学可以看看JVM源码。JDK不推荐在线程实例上使用wait,notify和notifyAll方法。
而在JDK1.5之后的并发包中提供的CountDownLatch也可以实现join的这个功能,并且比join的功能更多。
01
<pre>
public
class
CountDownLatchTest {
02
03
static
CountDownLatch c =
new
CountDownLatch(
2
);
04
05
public
static
void
main(String[] args)
throws
InterruptedException {
06
new
Thread(
new
Runnable() {
07
@Override
08
public
void
run() {
09
System.out.println(
1
);
10
c.countDown();
11
System.out.println(
2
);
12
c.countDown();
13
}
14
}).start();
15
16
c.await();
17
System.out.println(
"3"
);
18
}
19
20
}
CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。
当我们调用一次CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,你只需要把这个CountDownLatch的引用传递到线程里。
其他方法
如果有某个解析sheet的线程处理的比较慢,我们不可能让主线程一直等待,所以我们可以使用另外一个带指定时间的await方法,await(long time, TimeUnit unit): 这个方法等待特定时间后,就会不再阻塞当前线程。join也有类似的方法。
注意:计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会阻塞当前线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一个线程调用countDown方法 happen-before 另外一个线程调用await方法。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 并发工具类(一)等待多线程完成的CountDownLatch
- 并发工具类(一)等待多线程完成的CountDownLatch
- 并发工具类(一)等待多线程完成的CountDownLatch
- 并发工具类:等待多线程完成的CountDownLatch,和join的区别
- 等待多线程完成的CountDownLatch
- [Java并发]使用CountDownLatch和CyclicBarrier等待多线程完成
- Java并发编程-12-等待多个并发事件的完成-CountDownLatch
- 令仔学多线程系列(一)----同步工具类CountDownLatch
- Java并发和多线程4:使用通用同步工具CountDownLatch实现线程等待
- java多线程 等待多个并发事件的完成
- java多线程 等待多个并发事件的完成【转】
- 多线程进阶之并发工具类第一篇:CountDownLatch、CyclicBarrier
- JAVA多线程系列--并发工具类(CountDownLatch, CyclicBarrier, Semaphore,Exchanger)
- 一直被忽略的java 多线程并发工具类 CountDownLatch、Semaphore
- [笔记][Java7并发编程实战手册]3.4 等待多个并发事件的完成CountDownLatch倒计数闭锁
- Java并发工具类CountDownLatch
- java 并发工具类-CountDownLatch
- Java并发工具类CountDownLatch
- JAVA多线程—CountDownLatch-一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- 深入剖析ConcurrentHashMap(1)
- 深入剖析ConcurrentHashMap(2)
- win32汇编的segment,子程序,宏定义,局部变量定义test1
- 内存溢出 java.lang.OutOfMemoryError: PermGen space
- C++的一个输出方阵程序
- 并发工具类(一)等待多线程完成的CountDownLatch
- 并发工具类(二)同步屏障CyclicBarrier
- PAT 1130. Infix Expression (25) 折腾表达式,未解之谜
- 2017-09-14 LeetCode_315 Count of Smaller Numbers After Self
- could not extract ResultSet
- 欢迎使用CSDN-markdown编辑器
- 织梦调用缩略图原图的方法
- Nginx web服务器
- 怎么用PHP实现检测网站文章是否被收录