Executor源码解读
- 〇、[源码版本] jdk 1.8
- 一、不再显式创建线程
- [举例1]代码示例
- 二、不严格要求执行是异步的
- [举例1]代码示例
- 三、任务在调用者线程之外的某个线程中执行
- [举例1]代码示例
- 四、施加了某种限制的复合执行器
- [举例1]代码示例
- 五、concurrent包中提供的Executor的实现对象
- [举例1]
ExecutorService
,这是一个更广泛的接口。 - [举例2]
ThreadPoolExecutor
类,提供了一个可扩展的线程池实现。 - [举例3]
Executors
类,为这些类和接口提供了的工厂和实用方法。
- [举例1]
- 六、内存一致性影响
- 七、Executor接口只提供了execute方法
- execute方法
〇、[源码版本] jdk 1.8
一、不再显式创建线程
Executor
接口是执行提交的Runnable
任务的对象。这个接口提供了一种方法,将任务提交与每个任务如何运行的机制解耦,包括线程使用、调度等的细节。通常使用Executor
而不是显式创建线程。
[举例1]代码示例
为一组任务中的每个调用显式创建线程的方法:
new Thread(new(RunnableTask())).start()
使用Executor
方式可以替代显示创建线程的方法:
Executor executor = <em>anExecutor</em>;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
二、不严格要求执行是异步的
然而,Executor
接口并不严格要求执行是异步的。在最简单的情况下,一个执行器可以立即在调用者的线程中运行提交的任务。
[举例1]代码示例
class DirectExecutor implements Executor {public void execute(Runnable r) {r.run();}
}
三、任务在调用者线程之外的某个线程中执行
更典型的是,任务在调用者线程之外的某个线程中执行。
[举例1]代码示例
下面的执行程序为每个任务生成一个新线程 。
class ThreadPerTaskExecutor implements Executor {public void execute(Runnable r) {new Thread(r).start();}}
四、施加了某种限制的复合执行器
许多Executor
的实现对象,对任务的调度方式和时间施加了某种限制。
[举例1]代码示例
下面的执行器将任务的提交序列化到第二个执行器,是复合执行器。
class SerialExecutor implements Executor {final Queue<Runnable> tasks = new ArrayDeque<Runnable>();final Executor executor;Runnable active;SerialExecutor(Executor executor) {this.executor = executor;}public synchronized void execute(final Runnable r) {tasks.offer(new Runnable() {public void run() {try {r.run();} finally {scheduleNext();}}});if (active == null) {scheduleNext();}}protected synchronized void scheduleNext() {if ((active = tasks.poll()) != null) {executor.execute(active);}}}
五、concurrent包中提供的Executor的实现对象
concurrent
包中提供的Executor
的实现对象有:
[举例1]ExecutorService
,这是一个更广泛的接口。
一个ExecutorService
使用可能的几个线程池中的一个线程池,执行每个提交的任务,通常使用 Executors
工厂方法进行配置。
[举例2]ThreadPoolExecutor
类,提供了一个可扩展的线程池实现。
继承自AbstractExecutorService
接口,AbstractExecutorService
实现了ExecutorService
接口。
线程池解决两个不同的问题:
a.它们通常在执行大量异步任务时提供改进的性能,因为减少了每个任务的调用开销。
b.它们提供了一种限制和管理资源的方法,包括线程,在执行任务集合时的消耗。
同时,每个ThreadPoolExecutor
还维护一些基本的统计信息,例如已完成任务的数量。
[举例3]Executors
类,为这些类和接口提供了的工厂和实用方法。
在此concurrent
包中定义了Executor
、ExecutorService
、ScheduledExecutorService
、ThreadFactory
和Callable
类。
六、内存一致性影响
内存一致性影响:将Runnable
对象提交给Executor
之前,线程中的操作,其内存可见性发生在线程的执行开始前,也可能在另一个线程中。
七、Executor接口只提供了execute方法
execute方法
void execute(Runnable command);
execute
方法:在将来的某个时间执行给定的command
命令。命令可以在新线程、池线程或调用线程中执行,具体取决于Executor
的实现。
a.参数:runnable
类型的任务
b.返回:无
c.异常:
throws RejectedExecutionException
如果参数任务command
不能被接受执行
throws NullPointerException
如果参数任务command
为null