线程池系列--ExecutorService接口:任务提交
2016-04-09 00:00
411 查看
我关注的任务提交方法为:invokeAll, submit, executor
1 单任务提交:submit , executor
AbstractExecutorService 类的方法实现
不论何种形式的submit函数,都是把task封装成一个RunnableFuture对象,并调用execute函数。
那么FutureTask和RunnableFuture的关系是什么?
可知,FutureTask 是 RunnableFuture 的实现类。FutureTask对象既有任务,又会有任务执行结果。
2 批量提交 invokeAll
1 单任务提交:submit , executor
AbstractExecutorService 类的方法实现
public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Void> ftask = newTaskFor(task, null); //1 生成一个 RunnableFuture 对象,并调用 Executor接口中的void execute(Runnable command) 函数 execute(ftask); return ftask; } public <T> Future<T> submit(Runnable task, T result) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task, result); //2 生成一个 RunnableFuture 对象,并调用 Executor接口中的void execute(Runnable command) 函数 execute(ftask); return ftask; } public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task); //3 生成一个 RunnableFuture 对象,并调用 Executor接口中的void execute(Runnable command) 函数 execute(ftask); return ftask; }
不论何种形式的submit函数,都是把task封装成一个RunnableFuture对象,并调用execute函数。
//4 newTaskFor 函数,把Runnable,Callable封装成统一的FutureTask对象 protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) { return new FutureTask<T>(runnable, value); } protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) { return new FutureTask<T>(callable); }
那么FutureTask和RunnableFuture的关系是什么?
可知,FutureTask 是 RunnableFuture 的实现类。FutureTask对象既有任务,又会有任务执行结果。
//5 RunnableFuture 接口继承了Runnable, Future public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); } public class FutureTask<V> implements RunnableFuture<V> { //6 构造函数,把Callable 封装成 FutureTask public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; // ensure visibility of callable } //7构造函数,把Runnable封装成FutrueTask public FutureTask(Runnable runnable, V result) { this.callable = Executors.callable(runnable, result); this.state = NEW; // ensure visibility of callable } }
2 批量提交 invokeAll
//总体思路: 一一提交任务, 等待返回结果 public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException { if (tasks == null) throw new NullPointerException(); // 存放线程的执行结果 ArrayList<Future<T>> futures = new ArrayList<Future<T>>(tasks.size()); boolean done = false; try { for (Callable<T> t : tasks) { RunnableFuture<T> f = newTaskFor(t); futures.add(f); //不同的线程池,不同的实现方式 execute(f); } for (int i = 0, size = futures.size(); i < size; i++) { Future<T> f = futures.get(i); // 是否线程执行完毕, 如果没有执行完毕,则调用get() if (!f.isDone()) { try { f.get();//阻塞至执行完毕 } catch (CancellationException ignore) { } catch (ExecutionException ignore) { } } } done = true; // 只有所有的线程都执行完, 才返回 return futures; } finally { if (!done) for (int i = 0, size = futures.size(); i < size; i++) futures.get(i).cancel(true); } }
相关文章推荐
- JVM GC策略之:G1
- Java基础语言(4)
- Java——面向对象(一)
- history pushState 实现浏览器前进与后退
- Maven修改全局和局部JDK版本
- eclipse maven plugin 插件 安装 和 配置
- 品牌包装方案-搜索引擎
- pyside 安装使用笔记
- IBM服务器硬盘数据恢复
- eclipse 插件管理和使用
- eclipse常用设置
- Python enumerate 用法
- Python 小技巧
- Python 列表推导式
- Python 列表推导式(列表解析式)
- python 二分法思想
- Spring 复杂对象的注入
- Spring 使用其他命名空间的时候要注意的事项
- iOS调试技巧总结
- LitePal的开源框架-郭神