背景:

如果一个任务由多个子任务组成,子任务全部执行完成后然后由主线程对所有子任务结果进行封装,可以采用如下几种方式:

1、基于Guava ListenableFuture 进行;

2、基于FutureTask 和CountDownLatch进行

3、基于FutureTask进行;

4、基于CompletionService进行

5、基于BlockingQueue进行

说明:

2、3 的区别就是线程池时候每次都新建、shutdown;

4、5 是一个东西

 public static void listenableFuture() {
try {
ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2));
List<ListenableFuture<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 20; i++) {
final ListenableFuture<Integer> future = pool.submit(new CountTask());
futures.add(future);
Futures.addCallback(future, new FutureCallback<Integer>() {
@Override
public void onSuccess(Integer result) {
System.out.println(result);
} @Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
});
}
System.out.println("submit success");
ListenableFuture<List<Integer>> ret = Futures.successfulAsList(futures);
List<Integer> res = ret.get();
System.out.println(res);
pool.shutdown();
System.out.println("shutdown success");
} catch (Exception e) {
e.printStackTrace();
}
} public static void countDownCount() throws Exception {
int threadNum = 20;
ExecutorService executor = Executors.newCachedThreadPool();
CountDownLatch count = new CountDownLatch(threadNum);
List<FutureTask<Integer>> futureTasks = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
CountTask task = new CountTask(count);
FutureTask<Integer> futureTask = new FutureTask<>(task);
executor.submit(futureTask);
futureTasks.add(futureTask);
}
// 该动作会阻塞主线程知道各个线程完成任务
count.await();
System.out.println("执行完成");
for (FutureTask<Integer> futureTask : futureTasks) {
Integer ret = futureTask.get();
System.out.println(ret);
}
executor.shutdown();
System.out.println("测试完成");
} public static void futureTaskCount() throws Exception {
int threadNum = 20;
ExecutorService executor = Executors.newCachedThreadPool();
List<FutureTask<Integer>> futureTasks = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
CountTask task = new CountTask();
FutureTask<Integer> futureTask = new FutureTask<>(task);
executor.submit(futureTask);
futureTasks.add(futureTask);
}
// 关闭线程池,该动作会阻塞主线程知道线程池中线程执行完成
executor.shutdown();
System.out.println("shutdown");
for (FutureTask<Integer> futureTask : futureTasks) {
Integer ret = futureTask.get();
System.out.println(ret);
}
System.out.println("测试完成");
} public static void completionCount() throws Exception {
int threadNum = 20;
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
CompletionService<Integer> pool = new ExecutorCompletionService<Integer>(executor);
for (int i = 0; i < threadNum; i++) {
pool.submit(new CountTask());
}
for (int i = 0; i < threadNum; i++) {
Integer ret = pool.take().get();
System.out.println("输出结果" + ret);
}
System.out.println("测试完成");
executor.shutdown();
} // 使用阻塞容器保存每次Executor处理的结果,在后面进行统一处理
public static void blockingQueueCount() throws Exception {
ExecutorService exec = Executors.newCachedThreadPool();
BlockingQueue<Future<Integer>> queue = new LinkedBlockingQueue<Future<Integer>>();
for (int i = 0; i < 10; i++) {
Future<Integer> future = exec.submit(new CountTask());
queue.add(future);
}
int sum = 0;
int queueSize = queue.size();
for (int i = 0; i < queueSize; i++) {
sum += queue.take().get();
}
System.out.println("总数为:" + sum);
exec.shutdown();
}

  

Java 多线程执行的更多相关文章

  1. java 多线程执行过程

    1.分支线程执行 过程: 2.线程运行的状态:五大状态 线程: 从新建状态  就绪状态   运行状态  挂起(阻塞)状态 死亡状态(结束,销毁) 3. 多线程:在同一个时间执行多个任务的操作,现在的软 ...

  2. java多线程执行问题

    class Demo extends Thread{ public Demo(String name){ super(name); } public void run(){ for(int i=0; ...

  3. java 多线程执行时长统计

    ExecutorService——shutdown方法和awaitTermination方法 shutdown方法:平滑的关闭ExecutorService,当此方法被调用时,ExecutorServ ...

  4. java多线程执行时主线程的等待

    1.通过thread.join()方式,注意:如果有多个子线程,需要将全部的线程先start,然后再join.代码示例如下: public class Main {     public static ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程——<三>简单的线程执行:Executor

    一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个 ...

  7. Java 线程和多线程执行过程分析

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  8. JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗?

    一,问题描述 假设有两个线程在并发运行,一个线程执行的代码中含有一个死循环如:while(true)....当该线程在执行while(true)中代码时,另一个线程会有机会执行吗? 二,示例代码(代码 ...

  9. java 中多线程和锁的使用以及获取多线程执行结果

    多线程一:原生的写法   关键词 implements  实现  Runnable 类 run()  方法 注意点 : 创建类的实例 InterfaceController inter=new Int ...

随机推荐

  1. c#数据类型和类型转换

    C# 数据类型 在 C# 中,变量分为以下几种类型: 值类型(Value types) 引用类型(Reference types) 指针类型(Pointer types) 值类型(Value type ...

  2. 模拟 Codeforces Round #297 (Div. 2) A. Vitaliy and Pie

    题目传送门 /* 模拟:这就是一道模拟水题,看到标签是贪心,还以为错了呢 题目倒是很长:) */ #include <cstdio> #include <algorithm> ...

  3. selenium2+python自动化2-元素定位

    嘻嘻,书接上回,接着唠,这里先补充一下自动化要掌握的四个步骤吧:获取元素.操作元素.获取返回值.断言(返回结果与期望结果是否一致),最后就是自动化测试报告的生成.这一片主要讲一下如何进行元素定位.元素 ...

  4. SQL 多字段去重

    select articleID from (select aeUID, max(articleID) articleID from [article] group by aeUID) a conca ...

  5. P1303 A*B Problem

    题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式: 积 输入输出样例 输入样例#1: 1 2 输出样例#1: 2 说明 需用高精 #include<iostream> # ...

  6. 最优雅退出 Android 应用程序的 6 种方式

    一.容器式 建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activity import java.util.ArrayList; import java.util ...

  7. ssl证书过期问题解决

    1,ssl证书失效现象 小程序debug有如下证书无效信息: 浏览器访问https://ic-park.net:30001/indoornav/callFunction1.php 提示证书风险. 2, ...

  8. [Tunny]Git常用命令与入门

    [黄映焜/Tunny,20140709] Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制..g ...

  9. Tomcat7的安装与配置

    Tomcat的安装及配置我曾经使用过tomcat,并实现了一个简单的servlet程序.没想到再次安装tomcat的时候用浪费了我大半天的时间.我想有必要做个总结,否则下次不知又要花费我多少时间. 1 ...

  10. Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)

    A(By talker): 题意分析:以a(int) op b(int)形式给出两个整数和操作符, 求两个整数是否存在操作符所给定的关系 ,有则输出true,无则输出false: 思路:由于无时间复杂 ...