`

使用线程池以及FutureTask管理多线程任务

 
阅读更多
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;
	}

}

 

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;
	}

}

 

 

 

 

分享到:
评论

相关推荐

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    多线程文章目录

    以下文章基本上保证真实可信,如有谬误欢迎指正; 同时很多内容来自个人有道笔记的摘抄,如果有不清不楚的地方还请见谅,可留言...以及java为我们提供常用的线程池和任务调度ScheduledExecutorService以及工作窃取For

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    java8源码-concurrency:java并发总结

    并发多线程从简到全 参考: 目录: [TOC] 相关文档: kwseeker/netty Executors线程池.md 1 基本概念 1.1 CPU与线程的关系 1.2 线程与进程的区别和关系 1.3 吞吐量 1.4 线程安全 1.5 线程声明周期 1.6 守护线程 1.7 ...

    Java并发编程原理与实战

    了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程安全的原理(理论层面).mp4 synchronized保证线程安全的原理(jvm层面).mp4 单例问题...

    backport-util-concurrent-3.1.jar

    2. 丰富的功能:backport-util-concurrent-3.1.jar提供了许多实用的并发工具类,涵盖了多线程编程的各个方面,如任务调度、同步控制、线程池等。 3. 高性能:这个库的实现经过了优化,可以在高并发场景下提供良好的...

    java并发编程

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    Android异步并发类库Android-lite-go.zip

    可定义等待队列满载后处理新请求的策略:抛弃队列中最新的任务抛弃队列中最旧的任务抛弃当前新任务直接执行(阻塞当前线程)抛出异常(中断当前线程)LiteGo 使用初始化:// 智能并发调度控制器:设置[最大并发数]...

    龙果 java并发编程原理实战

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    Java 并发编程原理与实战视频

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    龙果java并发编程完整视频

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    Java并发编程实战

    6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 6.2.2 执行策略 6.2.3 线程池 6.2.4 Executor的生命周期 6.2.5 延迟任务与周期任务 6.3 找...

    Java 并发编程实战

    6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 6.2.2 执行策略 6.2.3 线程池 6.2.4 Executor的生命周期 6.2.5 延迟任务与周期任务 6.3 找...

Global site tag (gtag.js) - Google Analytics