使用线程池以及FutureTask管理多线程任务
来源:互联网 发布:java经典代码 编辑:程序博客网 时间:2024/06/05 17:21
此处为一个示例:
package com.ihuning.javase.demo.thread;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask;public class FutureTaskAndExecutor {/** * @param args */public static void main(String[] args) throws Exception {List<FutureTask<Integer>> list = new ArrayList<FutureTask<Integer>>();// 创建线程池,线程池的大小和List.size没有啥必然的关系,一般的原则是<=list.size,多出来浪费不好ExecutorService exec = Executors.newFixedThreadPool(5);List<Task> tasks = new ArrayList<Task>();for (int i = 1; i < 3; i++) {// 创建对象FutureTask<Integer> ft = new FutureTask<Integer>(new GetSum(i));// 添加到list,方便后面取得结果list.add(ft);// tasks.add(new Task(i,ft,false));// 一个个提交给线程池,当然也可以一次性的提交给线程池,exec.invokeAll(list);exec.submit(ft);// System.out.println("-submit the thread task.");}// 开始统计结果Integer total = 2;while (true) {System.out.println("-----------------------------");for (FutureTask<Integer> tempFt : list) {// System.out.print(tempFt + "\t");// System.out.println(tempFt.isDone());tempFt.get();if (tempFt.isDone()) {System.out.println("isDone---------------");total = total + tempFt.get();} else {System.out.println("--------------continue");continue;}}if (total < 0) {break;} else {Thread.sleep(1000);}}// int undoneCount = 0;// for(Task task : tasks)// {// if(!task.isDone())// {// undoneCount++;// }// }////// while(undoneCount > 0)// {// for(Task task : tasks)// {// if(task.isDone())// {// continue;// }// else// {// if(task.getFutureTasks().isDone())// {// Integer result = task.getFutureTasks().get();// System.out.println("--result--: " + result );// task.setDone(true);// undoneCount--;// }// else// {// continue;// }// }// }// Thread.sleep(2000);// }// 处理完毕,一定要记住关闭线程池,这个不能在统计之前关闭,因为如果线程多的话,执行中的可能被打断exec.shutdown();// System.out.println(new Date() + "----shutdown the thread pool----");}}class Task {private int id;private FutureTask<Integer> futureTasks;private boolean done;public Task(int id, FutureTask<Integer> futureTasks, boolean done) {System.out.println("set id: " + id);this.id = id;this.futureTasks = futureTasks;this.done = done;}public int getId() {return id;}public void setId(int id) {this.id = id;}public FutureTask<Integer> getFutureTasks() {return futureTasks;}public void setFutureTasks(FutureTask<Integer> futureTasks) {this.futureTasks = futureTasks;}public boolean isDone() {return done;}public void setDone(boolean done) {this.done = done;}}
package com.ihuning.javase.demo.thread;import java.util.concurrent.Callable;public class GetSum implements Callable<Integer> {private Integer total;public GetSum(Integer total) {this.total = total;}public Integer call() throws Exception {for (int i = 0; i < 10 - total; i++) {//System.out.println("["+Thread.currentThread().getName()+"]" + total);Thread.sleep(1000);}return total;}}
0 0
- 使用线程池以及FutureTask管理多线程任务
- 多线程任务Callable与Future或FutureTask的使用
- Android线程池(一)——Executors(线程池)以及FutureTask使用示例
- Java多线程研究06-带返回值的线程定义接口Callable以及Future,FutureTask的使用
- Spring线程池和JDK线程池的区别及与FutureTask配合使用得到任务执行结果
- 详解Java中的Future、FutureTask的原理以及与线程池的搭配使用
- Android中Callable、Future、FutureTask的概念以及几种线程池的使用
- FutureTask和线程池的结合使用
- android多线程以及线程池使用
- 记第一次使用线程池管理多线程
- futureTask和线程池
- 多线程中FutureTask的使用
- 线程池使用ExecutorService 多线程处理队列任务
- paip.java 多线程参数以及返回值Future FutureTask 的使用.
- 使用FutureTask执行并行耗时任务
- 多线程FutureTask的使用方法和使用实例
- 使用Callable和FutureTask创建线程
- Java多线程--任务执行(线程池)
- 学习Unity3D第十天之数组例题解析和类。
- if经验
- 注解
- poj 3080 暴力法 KMP+暴力枚举
- Linux crontab任务调度
- 使用线程池以及FutureTask管理多线程任务
- Android实现程序之间的跳转
- 我花了几乎一年的时间去证明我选择的错误
- 关于Asp.net负载均衡的一些说明介绍
- poj 1111 Image Perimeters
- Netapp存储模拟器一战成功
- Effective Modern C++ 笔记 第五章:Rvalue References, Move Semantics, and Perfect Forwarding
- 高亮listView的选中的item
- myeclipse 编译源文件 tomcat解释.class文件机制