CompletionService相当于Executor加上BlockingQueue,使用场景为当子线程并发了一系列的任务以后,主线程需要实时地取回子线程任务的返回值并同时顺序地处理这些返回值,谁先返回就先处理谁。下面两个类的工作效果相同,一个使用了CompletionService,代码更简捷些,一个直接使用的Executort和BlockingQueue,更复杂一些。其实读CompletionService的源代码,可以发现它内部其实就是对Executor和BlockingQueue的一个封装,不过封装后确定很优雅,用起来很方便。
1.TestCompletionService.java
package test;
import java.io.File;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestCompletionService {
private static final ExecutorService NEW_FIXED_THREAD_POOL = Executors.newFixedThreadPool(10);
private static final File[] in = { new File("in1"),
new File("in2"), new File("in3"), new File("in4"), new File("in5") };
private static File out = new File("out");
private static CompletionService<File> completionService = new ExecutorCompletionService<File>(
NEW_FIXED_THREAD_POOL);
private static class DownLoader<File> implements Callable<File> {
private int index;
public void setIndex(int index) {
this.index = index;
}
@Override
public File call() throws Exception {
try {
Thread.sleep(index * 10000);
System.out.println("sleet [" + index * 10000 + "];");
} catch (InterruptedException e) {
System.out.println(e);
}
System.out.println("put file [" + in[index] + "];" + "time ["
+ System.currentTimeMillis() + "];");
return (File) in[index];
}
}
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
DownLoader<File> downLoader = new DownLoader<File>();
downLoader.setIndex(i);
completionService.submit(downLoader);
}
for (int i = 0; i < 5; i++) {
try {
Future<File> future = completionService.take();
File file = future.get();
System.out.println("take file [" + file + "];" + "time ["
+ System.currentTimeMillis() + "];");
} catch (InterruptedException e) {
System.out.println(e);
} catch (ExecutionException e) {
System.out.println(e);
}
}
NEW_FIXED_THREAD_POOL.shutdown();
System.out.println("ok");
}
}
2.TestBlockingQueue.java
package test;
import java.io.File;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class TestBlockingQueue {
private static File[] in = { new File("in1"), new File("in2"),
new File("in3"), new File("in4"), new File("in5") };
private static File out = new File("out");
private static ExecutorService executorService = Executors.newFixedThreadPool(10);
private static class DownLoader implements Runnable {
private int index;
private BlockingQueue<File> blockingQueue;
public void setBlockingQueue(BlockingQueue<File> blockingQueue) {
this.blockingQueue = blockingQueue;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public void run() {
try {
Thread.sleep(index * 10000);
System.out.println("sleet [" + index * 10000 + "];");
} catch (InterruptedException e) {
System.out.println(e);
}
if (index == 3) {
}
try {
System.out.println("put file [" + in[index] + "];" + "time ["
+ System.currentTimeMillis() + "];");
blockingQueue.put(in[index]);
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
BlockingQueue<File> blockingQueue = new ArrayBlockingQueue<File>(10);
for (int i = 0; i < 5; i++) {
DownLoader downLoader = new DownLoader();
downLoader.setBlockingQueue(blockingQueue);
downLoader.setIndex(i);
executorService.execute(downLoader);
}
for (int i = 0; i < 5; i++) {
try {
File file = blockingQueue.poll(8, TimeUnit.SECONDS);
System.out.println("take file [" + file + "];" + "time ["
+ System.currentTimeMillis() + "];");
} catch (InterruptedException e) {
System.out.println(e);
}
}
executorService.shutdown();
System.out.println("ok");
}
}
分享到:
相关推荐
在本文中,我们将深入探讨S7ClientDemo的使用方法和功能,以帮助用户更好地理解和应用这款强大的工具。 1. **软件安装与启动** 首先,你需要下载并安装S7ClientDemo的压缩包文件。找到名为"S7ClientDemo"的文件,...
谷歌webrtc demo的使用教程,webrtc源代码自行从官网下载,该教程只给出了源代码详细的使用方法,包括如何编译
《Demo3D程序API离线手册20170331...手册中的每个章节都详细讲解了相关API的使用方法,并且通常配有示例代码,方便开发者快速上手。对于想要在三维仿真和可视化领域有所建树的开发者来说,这是一份不可多得的学习资料。
在"angularJs demo 各种基本用法"中,我们可以深入探讨以下几个关键概念:路由(router)、过滤器(filter)、服务(service)以及指令(diractive)。 **路由(Router)**: AngularJS的路由功能允许我们根据URL来...
这个"UISearchController用法Demo"就是用来演示如何有效地利用这个控制器来实现搜索功能。 首先,我们要理解UISearchController的基本结构和工作原理。它包含一个UISearchBar,用于接收用户的输入,以及一个结果...
转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖demo转盘抽奖...
本教程将深入讲解ContentProvider的使用方法,包括基础操作、多ContentProvider管理和多表操作。 首先,基础的ContentProvider用法涉及以下几个步骤: 1. **定义Uri匹配规则**:ContentProvider通过Uri(统一资源...
这个"UISwitch 用法demo"显然是一个示例项目,旨在展示如何创建和操作UISwitch,以及如何获取其当前的值。下面我们将深入探讨UISwitch的基本用法、属性和事件处理。 首先,UISwitch的创建可以通过代码或者Interface...
Gridview控件用法Demo 1:语言:ASP.NET(C#) 运行环境:Visual Studio2005+Access 2:功能模块简介 a)Gridview表头表尾; b)实现Gridview数据与Excel互导; c)Gridview多层嵌套的应用; d)Gridview分页排序功能的...
Android RecyclerView的基本用法Demo(源码),包含头视图的添加,数据展示,子项分割线引入及样式设置,子项的增删及动画,子项长短按事件引入等
增加3D相片demo增加文章note_jekyll更正图片档名增加作品集:表单删除tab选项卡的背景图更改posts/rwd的文章更改导航栏更正图片档名更正图片档名添加RWD文章各类网页设计项目demo演示各类网页设计项目demo演示各类...
微信小程序学习demo:基础接口演示demo(源代码+截图)微信小程序学习demo:基础接口演示demo(源代码+截图)微信小程序学习demo:基础接口演示demo(源代码+截图)微信小程序学习demo:基础接口演示demo(源代码+截图)微信...
小程序源码 移动端小商城DEMO (商城demo源码) (代码源)小程序源码 移动端小商城DEMO (商城demo源码) (代码源)小程序源码 移动端小商城DEMO (商城demo源码) (代码源)小程序源码 移动端小商城DEMO (商城demo源码) ...
微信小程序学习demo推荐:微赞社区(论坛demo)(适用1123(源代码+截图)微信小程序学习demo推荐:微赞社区(论坛demo)(适用1123(源代码+截图)微信小程序学习demo推荐:微赞社区(论坛demo)(适用1123(源代码+截图...
通联支付官方demo
一些html页面或是效果的demo 一些html页面或是效果的demo 一些html页面或是效果的demo 一些html页面或是效果的demo 一些html页面或是效果的demo 一些html页面或是效果...
echarts 图表案例demo很多好看的demoecharts 图表案例demo很多好看的demoecharts 图表案例demo很多好看的demoecharts 图表案例demo很多好看的demoecharts 图表案例demo很多好看的demoecharts 图表案例demo很多好看的...
在Demo3D中,不支持创建类库(Class),但可以使用.NET现有类库;不支持类型为数列(Array)、对象(Object)或函数(Function)的常量;不能调用含有变量列表(params)的方法;函数不能指定返回值的类型;Demo3D中...
总的来说,"easyui_demo" 提供了一个了解和学习 EasyUI 的良好平台,对于初学者来说,可以通过分析和修改这些示例,快速掌握 EasyUI 的使用方法,并将其应用到自己的项目中。对于有经验的开发者,这些示例也可以作为...
命令配置部分提供了XS2184 DEMO板的命令配置方法,包括基本命令、串口命令、UART命令等。用户可以根据实际情况选择适合的命令配置方式,例如使用串口命令、UART命令等。 DEMO电路原理图、布局布线指导原则和PCB组装...