多线程工具之CompletionService
这里涉及到Java的多线程并发知识,以及线程池相关的知识。就不在此说明了。具体说说CompletionService的应用场景和使用方法。
比如我们有10个线程需要丢到线程池里面去执行,然后把10个线程的执行结果返回回来处理。如果没有使用CompletionService,我们的实现方式如下。首先创建线程类Worker
private static class Worker implements Callable<Integer> {
private int time;
public Worker(int time) {
this.time = time;
}
@Override
public Integer call() throws Exception {
Thread.sleep(time);
return time;
}
}
因为我这里是写到主方法类里面的,所以是private static。
主方法实现代码如下:
private static void main(String[] args) throws InterruptedException, ExecutionException {
// 定义线程池
ExecutorService pool = Executors.newFixedThreadPool(10);
// 定义存储线程的集合
BlockingQueue<Future<Integer>> tasks = new LinkedBlockingQueue<>();
for (int i = 0; i < 10; i++) {
Worker work = null;
if (i % 2 == 0) {
work = new Worker(i * 100);
} else {
work = new Worker(i * 50);
}
tasks.add(pool.submit(work));
}
for (int i = 0; i < 10; i++) {
int m = tasks.take().get();
System.out.println("result=" + m);
}
pool.shutdown();
}
打印出的结果如下:
result=0
result=50
result=200
result=150
result=400
result=250
result=600
result=350
result=800
result=450
可以看到,无论线程谁先执行完,最后都是先放进线程池的先取出结果。而如果我们想要哪个线程先执行完就先返回结果怎么办呢。这时候就需要CompletionService了。具体代码如下,只有主方法有变化:
private static void main(String[] args) throws InterruptedException, ExecutionException {
// 定义线程池
ExecutorService pool = Executors.newFixedThreadPool(10);
//定义ExecutorService
CompletionService<Integer> service=new ExecutorCompletionService<>(pool);
for (int i = 0; i < 10; i++) {
Worker work = null;
if (i % 2 == 0) {
work = new Worker(i * 100);
} else {
work = new Worker(i * 50);
}
service.submit(work);
}
for (int i = 0; i < 10; i++) {
int m = service.take().get();
System.out.println("result=" + m);
}
pool.shutdown();
}
执行结果如下:
result=0
result=50
result=150
result=200
result=250
result=350
result=400
result=450
result=600
result=800
我们可以看到,先执行完的数据就先返回了,实现了我们的预期。
多线程工具之CompletionService的更多相关文章
- java中重要的多线程工具类
前言 之前学多线程的时候没有学习线程的同步工具类(辅助类).ps:当时觉得暂时用不上,认为是挺高深的知识点就没去管了.. 在前几天,朋友发了一篇比较好的Semaphore文章过来,然后在浏览博客的时候 ...
- Axel多线程工具安装
Axel 是 Linux 下一个不错的轻量级高速下载工具,支持HTTP/FTP/HTTPS/FTPS协议,支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件. 大家使用 ...
- Java多线程工具类之循环栅栏计数器
Java多线程下循环计数器 本文主要内容:CyclicBarrier(下文中凯哥就用cycBar来代替)定义介绍:举例说明:代码演示:从源码来看原理及总结:CyclicBarrier与CountDow ...
- Java多线程-工具篇-BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...
- Java多线程-工具篇-BlockingQueue(转)
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...
- 多线程工具类:CountDownLatch、CyclicBarrier、Semaphore、LockSupport
◆CountDownLatch◆ 假如有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以.比如你想要买套房子,但是呢你现在手上没有钱.你得等这个月工资发了.然后年终奖发了.然后朋友借你得钱 ...
- [Java基础] Java多线程-工具篇-BlockingQueue
转载自: http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.html 前言: 在新增的Concurrent包中,BlockingQue ...
- 多线程——工具类之Semaphore
一.Semaphore功能介绍 Semaphore类相当于线程计数器,在获取Semaphore对象时设定可以产生的线程总数(线程并不是Semaphore类生成的,它只是统计线程的数量),创建Semap ...
- 使用java多线程分批处理数据工具类
最近由于业务需要,数据量比较大,需要使用多线程来分批处理,提高处理效率和能力,于是就写了一个通用的多线程处理工具,只需要实现自己的业务逻辑就可以正常使用,现在记录一下 主要是针对大数据量list,将l ...
随机推荐
- android之自定义弹框
step1 创建窗体 final AlertDialog dialog =new Builder(this).create(); step2 获取View View viewDialog =View. ...
- Android图片裁剪解决方案 -- 从相册截图
在看Storage Access Framework,里面有一个加载相册图片的程序片断,可能是系统版本的问题,无法返回结果,这里找到一个适用于旧版本的方法. 在Android开发中,可以轻松调用一个I ...
- NOIP 2016 天天爱跑步 (luogu 1600 & uoj 261) - 线段树
题目传送门 传送点I 传送点II 题目大意 (此题目不需要大意,我认为它已经很简洁了) 显然线段树合并(我也不知道哪来这么多显然) 考虑将每条路径拆成两条路径 s -> lca 和 t -> ...
- 【示例】Spring Quartz入门
JAVA 针对定时任务,有 Timer,Scheduler, Quartz 等几种实现方式,其中最常用的应该就是 Quartz 了. 一. Quartz的基本概念 在开始之前,我们必须了解以下的几个基 ...
- SQL语句总结2018-11-7
增加一条数据 insert into table (列字段1,列字段2)values(列1值,列2值) 删除一条数据 delete from table where 列名1=值1 修改一条数据 upd ...
- 牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)
https://www.nowcoder.com/acm/contest/38/E 题意: 思路: 树状数组维护.从大佬那里学习了如何处理爆long long的方法. #include<iost ...
- PHP中SESSION自定义会话管理器
<?php class CustomSession implements SessionHandlerInterface{ private $link; private $lifetime; p ...
- WebBrowser获取完整COOKIE
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool ...
- 返回Json格式结果
static string ReturnData(int resultCode, string resultMessage = "", string resultData = &q ...
- node.js基本概念简单解释
1:什么是回调函数? 2:什么是同步异步 3:什么是I/O 4:什么是单线程/多线程 5:什么是阻塞/非阻塞 6:什么是事件 7:什么是事件驱动 8:什么是事件驱动的回调 9:什么是事件循环 解释: ...