博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java线程池的原理学习
阅读量:6417 次
发布时间:2019-06-23

本文共 3111 字,大约阅读时间需要 10 分钟。

Executor接口

如果查看jdk文档,会发现java线程池都源自于这个超级接口Executor,但是这个接口本身比较简单:

public interface Executor {    /**        在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,        这由 Executor 实现决定。     *     * @param command the runnable task     * @throws RejectedExecutionException if this task cannot be     * accepted for execution.     * @throws NullPointerException if command is null     */    void execute(Runnable command);}

可以看到Executor 中只有一个execute 方法。此接口提供一种将任务提交与每个任务将如何运行的机制分离开来的方法,相比较为每个人物调用new Thread(Runnable r).start() ,我们更偏向于使用Executor (执行器)来运行任务:

Executor executor = anExecutor;executor.execute(new RunnableTask1());executor.execute(new RunnableTask2()); ...

实现一个执行器也很简单:

class ThreadPerTaskExecutor implements Executor {     public void execute(Runnable r) {         new Thread(r).start();     } }

ExecutorService接口

Executor 提供的方法太少了!根本不能满足日常所需,而从它派生下来的接口ExecutorService 则显得更通用,毕竟它也是个Service。

public interface ExecutorService extends Executor {    void shutdown();    List
shutdownNow(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
Future
submit(Callable
task);
Future
submit(Runnable task, T result); Future
submit(Runnable task);
List
> invokeAll(Collection
> tasks) throws InterruptedException;
T invokeAny(Collection
> tasks) throws InterruptedException, ExecutionException; ...}

可以看到,ExecutorService 接口中包含了我们平常使用的线程池的绝大多数方法,其中的一些方法在上文已经介绍过了。

AbstractExecutorService

AbstractExecutorService是一个抽象类,并且实现了ExecutorService接口。

public abstract class AbstractExecutorService implements ExecutorService

在这个类中,提供了ExecutorService 一些方法的默认实现,比如submitinvokeAll ,首先看submit 的实现:

public 
Future
submit(Callable
task) { if (task == null) throw new NullPointerException(); RunnableFuture
ftask = newTaskFor(task); execute(ftask); return ftask;}

其中使用了newTaskFor 方法:

protected 
RunnableFuture
newTaskFor(Callable
callable) { return new FutureTask
(callable);}

newTaskFor 方法只是简单的将给定可调用任务包装成一个RunnableFuture ,使其具有取消运行的特性。而submit 中直接将任务交给execute() 运行.

再来看invokeAll() :

public 
List
> invokeAll(Collection
> tasks) throws InterruptedException { if (tasks == null) throw new NullPointerException(); //创建一个list保存所有的结果 List
> futures = new ArrayList
>(tasks.size()); boolean done = false; try { for (Callable
t : tasks) { RunnableFuture
f = newTaskFor(t); futures.add(f); execute(f); //运行任务 } for (Future
f : futures) { if (!f.isDone()) { //依次取结果 try { f.get(); //这里使用get是为了等待运行完成,如果没完成就会阻塞 } catch (CancellationException ignore) { } catch (ExecutionException ignore) { } } } done = true; return futures; } finally { if (!done) //如果发生异常,则取消所有任务 for (Future
f : futures) f.cancel(true); } }

转载地址:http://fkvra.baihongyu.com/

你可能感兴趣的文章
Android Browser学习十 快捷菜单模块: PieMenu的实现(2)
查看>>
国外的opencv识别文档
查看>>
Windows不能用鼠标双击运行jar文件怎么
查看>>
GBK与UTF-8的区别
查看>>
java获取指定字符串的下一个
查看>>
多行数据提交到Struts的ActionForm的List属性中
查看>>
理解RESTful架构
查看>>
Linux自动压缩备份目录文件与恢复
查看>>
Android 图片相关整理
查看>>
OC内存管理(ARC)--多对象内存管理
查看>>
Spring实战 (二) Spring2.5/3.0新特性及XML配置文件命名空间介绍
查看>>
创建一个Hello World(React),组件的作用
查看>>
java中的context
查看>>
进程和线程的区别和联系
查看>>
排队论---单服务台负指数分布排队系统的分析
查看>>
Spring源码阅读——3
查看>>
golang调用dll
查看>>
使用ZXing生成可供手机识别的二维码
查看>>
【原创】modb 开发之需求和总体设计
查看>>
幸福是什么?
查看>>