非主流并发工具之 CompletionService
CompletionService
接口的实例可以充当生产者和消费者的中间处理引擎,从而达到将提交任务和处理结果的代码进行解耦的目的。生产者调用 submit
方法提交任务,而消费者调用 poll
(非阻塞)或 take
(阻塞)方法获取下一个结果:这一特征看起来和阻塞队列(BlockingQueue
)类似,两者的区别在于 CompletionService
要负责任务的处理,而阻塞队列则不会。
在 JDK 中,该接口只有一个实现类 ExecutorCompletionService
,该类使用创建时提供的 Executor
对象(通常是线程池)来执行任务,然后将结果放入一个阻塞队列中:果然本就是一家亲啊!ExecutorCompletionService
将线程池和阻塞队列糅合在一起,仅仅通过三个方法,就实现了任务的异步处理,可谓并发编程初学者的神兵利器!
接下来看一个例子。楼主有一大堆 *.java 文件,需要计算它们的代码总行数。利用 ExecutorCompletionService
可以写出很简单的多线程处理代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public
int
countLines(List<Path> javaFiles)
throws
Exception {
ExecutorService es = Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors() *
2
);
CompletionService cs =
new
ExecutorCompletionService(es);
for
(
final
Path javaFile : javaFiles) {
cs.submit(
new
Callable<Integer>() {
@Override
public
Integer call()
throws
Exception {
return
countLines(javaFile);
}
});
}
try
{
int
loc =
0
;
int
size = javaFiles.size();
for
(
int
i =
0
; i < size; i++) {
loc += cs.take().get();
}
return
loc;
}
finally
{
es.shutdown();
}
}
|
最后,CompletionService
也不是到处都能用,它不适合处理任务数量有限但个数不可知的场景。例如,要统计某个文件夹中的文件个数,在遍历子文件夹的时候也会“递归地”提交新的任务,但最后到底提交了多少,以及在什么时候提交完了所有任务,都是未知数,无论 CompletionService
还是线程池都无法进行判断。这种情况只能直接用线程池来处理。
相关推荐
java并发之并发工具类,并发工具类有很多,这里主要介绍了CyclicBarrier、CountDownLatch、Semaphore、Exchanger
HTTP高并发测试工具
Java并发工具包java_util_concurrent_user_guide_cn。
WEB API 多线程并发测试工具; WEB API 多线程并发测试工具
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev...
Java 8并发工具包漫游指南
网站抗压并发连接测试工具,内网版 网站抗压并发连接测试工具,内网版
代码只有几行,实现s3上传并发与下载并发,是ceph s3接口测试工具。欢迎下载,需要3分哦。 s3接口并发测试工具 s3上传并发测试 s3下载并发测试 s3并发测试
多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题。
一款定制的压测工具, 对webapi webserver 等一些借口进行压测 , 可以自定义并发数量.
内网并发测试工具,做接口测试必备工具,内网调试,高并发调试测试工具
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
这是一个库包含了Java并发库一些有用和智能工具类。
深入了解Java的并发开发工具包的基本原理,有兴趣的可以学习下。
ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。
windows下模拟高并发来进行负载测试工具。一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。
一、总论:在JDK中提供了几种并发工具类 1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成) 2)CyclicBarrier(循环屏障:同步屏障) 3)Semaphore(信号量:控制并发进程数) 主要参考...
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...