Java 多线程执行
背景:
如果一个任务由多个子任务组成,子任务全部执行完成后然后由主线程对所有子任务结果进行封装,可以采用如下几种方式:
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 多线程执行的更多相关文章
- java 多线程执行过程
1.分支线程执行 过程: 2.线程运行的状态:五大状态 线程: 从新建状态 就绪状态 运行状态 挂起(阻塞)状态 死亡状态(结束,销毁) 3. 多线程:在同一个时间执行多个任务的操作,现在的软 ...
- java多线程执行问题
class Demo extends Thread{ public Demo(String name){ super(name); } public void run(){ for(int i=0; ...
- java 多线程执行时长统计
ExecutorService——shutdown方法和awaitTermination方法 shutdown方法:平滑的关闭ExecutorService,当此方法被调用时,ExecutorServ ...
- java多线程执行时主线程的等待
1.通过thread.join()方式,注意:如果有多个子线程,需要将全部的线程先start,然后再join.代码示例如下: public class Main { public static ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java多线程——<三>简单的线程执行:Executor
一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个 ...
- Java 线程和多线程执行过程分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗?
一,问题描述 假设有两个线程在并发运行,一个线程执行的代码中含有一个死循环如:while(true)....当该线程在执行while(true)中代码时,另一个线程会有机会执行吗? 二,示例代码(代码 ...
- java 中多线程和锁的使用以及获取多线程执行结果
多线程一:原生的写法 关键词 implements 实现 Runnable 类 run() 方法 注意点 : 创建类的实例 InterfaceController inter=new Int ...
随机推荐
- pycharm 添加个人信息
2. 可以使用搜索快速找到"File and Code Templates", 右侧菜单选择"Python Script",对模板进行编辑 格式为: ${< ...
- oracle错误:1067进程意外终止
oracle错误:1067进程意外终止我Oracle安装完了之后可以运行的 ,过了一段时间不可以了,就上网找了一下,原来是自己的ip已经改变.我一直使用IP地址的. 将D:\oracle\produc ...
- 交表(Send a Table)
#include<stdio.h> #include<string.h> #define N 50010 int phi[N],n,sum[N]; void phi_table ...
- JSP | 基础 | JSP状态管理 | Cookie
Cookie : 是web服务器保存在客户端的一系列文本信息. Cookie的作用: 1.对特定的对象的追踪 2. 3. JSP中创建Cookie以及使用 创建Cookie对象 写入Cookie对象 ...
- Codeforces Round #324 (Div. 2)
CF的rating设置改了..人太多了,决定开小号打,果然是明智的选择! 水 A - Olesya and Rodion #include <bits/stdc++.h> using na ...
- AIDL(1):简介
Android 接口定义语言 (AIDL) 1.AIDL是什么 AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似. 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进 ...
- iOS UILabel UITextView自适应文本,或文本大小自适应
//UILabel自适应文本的高度 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; label.numberOf ...
- 【译】建立属于你的个人高效系统——效率专家 Mike Vardy 教你如何设置一个简单的个人高效系统
原文:http://mux.baidu.com/?p=5300 百度MUX 已经有太多的高效系统供人使用,而对于那些刚刚开始,想寻求更好方法完成他们任务,项目,目标的人来说,要做一个高效系统却是相当艰 ...
- 十个非常棒的学习angularjs的英文网站
AngularJS 是非常棒的JS框架,能够创建功能强大,动态功能的Web app.AngularJS自2009发布以来,已经广泛应用于Web 开发中.但是对想要学习Angular JS 的人而言,只 ...
- [转]深入浅出WPF(7)——数据的绿色通道,Binding
本文转自:http://liutiemeng.blog.51cto.com/120361/95273 小序: 怎么直接从2蹦到7啦?!啊哦,实在是不好意思,最近实在是太忙了,忙的原因也非常简单——自己 ...