Java并发之ThreadPoolExecutor和FutureTask
来源:互联网 发布:淘宝服饰店铺简介 编辑:程序博客网 时间:2024/06/05 16:58
ExecutorService.submit(Runnable task)方法及其重载方法的返回类型为Future,其真实类型为FutureTask。类图如下:
由类图可知,FutureTask是Future和Runnable的合体,并且持有任务Runnable或者Callable。future.get()是一个阻塞方法,直到任务完成才返回。再看ThreadPoolExecutor类图:
当ExecutorService.submit(Runnable task)方法及其重载方法执行时(这些方法由AbstractExecutorService实现),FutureTask会被实例化:
public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Object> ftask = newTaskFor(task, null); 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); execute(ftask); return ftask; } public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task); execute(ftask); return ftask; }这些方法都调用了execute()方法。需要注意的是submit(Runnable task)方法返回的Future调用其get()将返回null。 newTaskFor()方法:
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构造方法:
public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); sync = new Sync(callable); } public FutureTask(Runnable runnable, V result) { sync = new Sync(Executors.callable(runnable, result)); }callable和runnable都会被包装成Sync。Executors.callable()方法:
public static <T> Callable<T> callable(Runnable task, T result) { if (task == null) throw new NullPointerException(); return new RunnableAdapter<T>(task, result); }再看看Executors的几个创建线程池的静态方法:
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }它们都实例化了一个线程池,并且传入了相应的阻塞队列。
0 0
- Java并发之ThreadPoolExecutor和FutureTask
- java并发编程之FutureTask
- java并发编程之ThreadPoolExecutor
- java并发编程之ThreadPoolExecutor
- Java并发编程之Callable,Future,FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- 优秀程序员的18大法则-兄弟连IT教育
- Error —— 打出log:finished with non-zero exit value 2
- HLS 流媒体技术 笔记
- js 关键字 in 的使用方法
- listview缓慢滚动到顶部的问题
- Java并发之ThreadPoolExecutor和FutureTask
- iOS --一个倒计时类
- 正则表达式,匹配文件名类型
- 连续数打乱,判断出少了哪些数字
- NSThread简介
- iOS开发UI篇—CALayer简介
- SQL 中order by 、group by 、having的用法区别
- 关键字 __typeof__
- LeetCode(107) Binary Tree Level Order Traversal II