多线程工具之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 ...
随机推荐
- Magnum Kubernetes源码分析(二)
Kubernetes Master Stack kubernetes master的stack的resources主要分为三个部分. master wait handle wait handle主要用 ...
- python 函数,闭包
假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print(bi ...
- Python3基础 list enumerate 将列表的每个元素转换成 带索引值的元组
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- repo forall -c 用法【转】
本文转载自:https://blog.csdn.net/u010164190/article/details/78332484 .repo forall命令 # repo forall -help # ...
- Ubuntu 系统学习
apt 命令 apt-get remove [app] # 删除已安装的软件包(保留配置文件),不会删除依赖软件包,且保留配置文件 apt-get remove --pure [app] # 删除已安 ...
- SpringBoot 使用Sharding-JDBC进行分库分表及其分布式ID的生成
为解决关系型数据库面对海量数据由于数据量过大而导致的性能问题时,将数据进行分片是行之有效的解决方案,而将集中于单一节点的数据拆分并分别存储到多个数据库或表,称为分库分表. 分库可以有效分散高并发量,分 ...
- 【做题】BZOJ2534 L-gap字符串——调和级数
题意:给出一个字符串,问其中有多少个子串恰好为\(uvu\)的形式.其中,\(u\)非空,\(v\)的长度恰好为\(l\). \(n \leq 5 \times 10^4\) 我们设两个后缀的起点分别 ...
- (转载)C#工具箱Menustrip控件中分割线的设置方法
最近编C#程序,因为初学,不是太清楚,碰到了toolstripMenu中分割线设置的问题.遍寻中文网页,都是语言不详的,甚是呕人. 上网找了个外文网站,给的答案甚是详细,先贴在下面. http://w ...
- Linux 压缩、解压命令使用
tar在Linux上是常用的打包.压缩.加压缩工具,他的参数很多,这里仅仅列举常用的压缩与解压缩参数 参数: -c :create 建立压缩档案的参数:(个人理解也就是打包) -x : 解压缩压缩档案 ...
- 17秋 SDN课程 第五次上机作业
17秋 SDN课程 第五次上机作业 Project:https://github.com/Wasdns/new_balance Slide is available at https://github ...