`
henryyang
  • 浏览: 111777 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论
阅读更多

非主流并发工具之 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 );
     // 使用 ExecutorCompletionService 内建的阻塞队列。
     CompletionService cs = new ExecutorCompletionService(es);
 
     // 按文件向 CompletionService 提交任务。
     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++) {
             // take 方法等待下一个结果并返回 Future 对象。不直接返回计算结果是为了
             // 捕获计算时可能抛出的异常。
             // poll 不等待,有结果就返回一个 Future 对象,否则返回 null。
             loc += cs.take().get();
         }
         return loc;
     } finally {
         // 关闭线程池。也可以将线程池提升为字段以便重用。
         // 如果任务线程(Callable#call)能响应中断,用 shutdownNow 更好。
         es.shutdown();
     }
}

最后,CompletionService 也不是到处都能用,它不适合处理任务数量有限但个数不可知的场景。例如,要统计某个文件夹中的文件个数,在遍历子文件夹的时候也会“递归地”提交新的任务,但最后到底提交了多少,以及在什么时候提交完了所有任务,都是未知数,无论 CompletionService 还是线程池都无法进行判断。这种情况只能直接用线程池来处理。

0
1
分享到:
评论

相关推荐

    Java并发工具包

    Java并发工具包是Java平台中的一个关键特性,它位于`java.util.concurrent`包下,为开发者提供了高效、安全的多线程编程支持。这个工具包的设计目标是简化并发编程...学习和掌握这个工具包是Java开发者的必备技能之一。

    内网并发测试工具

    内网并发测试工具是针对网络服务接口进行性能和稳定性测试的重要软件,特别是在内网环境中的应用,它能够帮助开发者和测试工程师模拟大量并发用户请求,以此来检验系统在高负载情况下的表现。这类工具通常包括多种...

    java并发工具包

    Java并发工具包是Java平台中用于处理多线程并行计算的重要组件,它包含在`java.util.concurrent`包中。这个工具包提供了多种高级并发工具,使得开发者能够编写出高效、安全、易于理解和维护的多线程代码。下面将详细...

    WEBAPI多线程并发测试工具

    标题"WEBAPI多线程并发测试工具"指出,这是一个专门针对Web API进行多线程并发测试的工具。Web API通常指的是应用程序接口,它们允许不同的服务之间进行通信,以实现数据交换和功能整合。多线程并发测试则是验证在多...

    java并发工具类

    Java并发工具类是Java平台提供的一系列用于处理多线程并发问题的类和接口,它们在`java.util.concurrent`包中。并发问题主要包括资源竞争、死锁、活锁以及饥饿等,合理使用并发工具可以有效地提高程序的并发性能并...

    Httpbfljcsgj_并发连接测试工具(内网版).rar

    "Httpbfljcsgj_并发连接测试工具(内网版).rar" 提供的正是这样一种专门用于测试网站并发连接性能的工具,适用于内网环境。 并发连接测试工具的主要作用是模拟多个用户同时访问网站或服务,以检查服务器在高负载情况...

    HTTP高并发测试工具

    HTTP高并发测试工具

    HTTP并发测试工具

    这个工具对于开发者、系统管理员以及性能测试人员来说非常实用,能够帮助他们评估和优化网络服务器的性能,确保在高并发访问下系统的稳定性和响应速度。 首先,我们需要理解HTTP和HTTPS协议的基础。HTTP(超文本...

    深入浅出_Java并发工具包原理讲解

    Java并发工具包(J.U.C)是Java编程语言中用于并发编程的一系列工具包的统称,它包含了一系列方便实现多线程编程的类和接口,使得开发者可以更加方便地编写高效、线程安全的程序。本文将深入浅出地探讨J.U.C的原理和...

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    06、JUC并发工具类在大厂的应用场景详解-ev

    06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev06、JUC并发工具类在大厂的应用场景详解_ev...

    并发编程——并发工具类.pdf

    ### 并发编程——并发工具类 #### 知识点概述 并发编程是Java编程中的高级主题,主要目的是为了让程序能够充分利用多核CPU的优势,提高程序的执行效率。并发工具类则是Java中用于支持多线程协作和同步控制的一系列...

    s3接口并发测试工具-上传与下载并发测试

    代码只有几行,实现s3上传并发与下载并发,是ceph s3接口测试工具。欢迎下载,需要3分哦。 s3接口并发测试工具 s3上传并发测试 s3下载并发测试 s3并发测试

    web压测高并发接口测试工具

    一款定制的压测工具, 对webapi webserver 等一些借口进行压测 , 可以自定义并发数量.

    测试并发小工具

    C#作为.NET框架的主要编程语言,提供了丰富的工具和特性来支持并发编程。下面我们将深入探讨“测试并发小工具”这个项目中的关键知识点。 1. **线程(Thread)**:C#中的`System.Threading.Thread`类是实现并发的...

    PyQt5并发测试工具

    这个小工具的设计目的是为了帮助开发者和测试人员评估他们的网络服务在高并发情况下的性能和稳定性。通过模拟多个并发请求,可以更好地理解和优化系统的负载处理能力。 首先,PyQt5是Python的一个强大的图形用户...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

Global site tag (gtag.js) - Google Analytics