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 ...
随机推荐
- scrapy 连接错误
twisted.python.failure.failure twisted.internet.error.connectionlost: connection to the other side w ...
- hdu 5409 CRB and Graph(边双联通分量)
题意: 给一个图一些边,保证图连通 问对于每条边,如果去除该边后使得图中一些点不连通.设这些点(u,v),要求使u尽量小,v尽量大,输出这样的(u,v).否则输出0 0. #include <b ...
- PHP读取MySQL数据
方法/步骤 先配置一下数据库: define("DB_HOST","localhost");//数据库地址,一般为localhost define(&q ...
- python中的栈
# @File: stack # 列表实现栈 class MyStack(object): def __init__(self): self.data = [] def push(self, item ...
- Lightoj 1044 - Palindrome Partitioning (DP)
题目链接: Lightoj 1044 - Palindrome Partitioning 题目描述: 给一个字符串,问至少分割多少次?分割出来的子串都是回文串. 解题思路: 先把给定串的所有子串是不 ...
- Educational Codeforces Round 24 E
Vova again tries to play some computer card game. The rules of deck creation in this game are simple ...
- HDOJ 5475 An easy problem
题目传送门 题意:一个计算器,两种操作,乘上x,或者除掉之前的某个x,结果取模输出 分析:因为取模不支持除法,然后比赛时想到用逆元,结果发现MOD需要与b互质,结果一直苦苦寻找求逆元的其它方法.后来队 ...
- Sublime3注册码和安装中文包
1.Sublime3注册码 在工具栏Help中点击Enter license,粘贴下面一大串 —– BEGIN LICENSE —– Michael Barnes Single User Licens ...
- Webform 内置对象2(Session、Application)、Repeater的Command操作
内置对象: 1.Session:跟Cookies一样用来存储用户数据,但保存位置不同,保存在服务器内存上 每一台电脑访问服务器,都会是独立的一套session,key值都一样,但是内容都是不一样的 S ...
- synchronize早已经没那么笨重
我发现一些同学在网络上有看不少synchronize的文章,可能有些同学没深入了解,只看了部分内容,就急急忙忙认为不能使用它,很笨重,因为是采用操作系统同步互斥信号量来实现的.关于这类的对于synch ...