添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Executor

继承图

我们先来看看线程池的类继承图

简介

Executor作为线程池的顶级接口, 定义了 task 的提交方法, 并将 task 提交 执行 进行了 解耦 .

核心方法

Executor 接口中只有一个 execute 方法, 用于提交任务.

1
2
3
public interface Executor {
void execute(Runnable command);
}

ExecutorService

简介

Executor 提供了向线程池中提交任务的方式,但是却没有提供管理线程池的相关方法.

ExecutorService 定义了基于 execute submit 方法, 该方法会返回一个 Future 对象, 此对象可用于停止 task 的执行或等待 task 执行成功.

同时还定义了 shutdown 方法和 shutdownNow 方法来关闭线程池

核心方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public interface ExecutorService extends Executor {

// 关闭线程池, 如果线程池中有task, 则会执行这些task, 该方法不会等待先前提交的task执行完成,
// 线程池将不再接受新task
void shutdown();

// 尝试停止所有的task, 停止等待中的task, 并返回正在等待执行的task
// 此方法不等待主动执行的任务终止, 除了尽最大努力尝试停止处理正在执行的任务之外,没有任何保证.
// 典型的实现将通过Thread.interrupt取消,因此任何无法响应中断的任务都可能永远不会终止.
List<Runnable> shutdownNow();

// 返回当前线程池是否关闭
boolean isShutdown();

// 返回此线程池所有的task是否全部停止
// 请注意,除非先调用shutdown或shutdownNow, 否则isTerminated永远不会为true.
boolean isTerminated();

// 阻塞,直到关闭请求后所有任务完成执行,或者发生超时,或者当前线程被中断(以先发生者为准).
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;

// 提交一个task, 返回Future, Future.get方法可获取task的执行结果
<T> Future<T> submit(Callable<T> task);

// 同上
<T> Future<T> submit(Runnable task, T result);

// 同上
Future<?> submit(Runnable task);

// 执行集合中所有的task
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)

// 超时执行集合中所有的task
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout,
TimeUnit unit)

// 执行集合中任意一个的task, 就返回
<T> T invokeAny(Collection<? extends Callable<T>> tasks);

// 超时执行集合中任意一个的task, 就返回
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit);
}

代码中的 shutdown shutdownNow 都不保证已执行 task 的完成, 如果想要做到已执行的 task 完成后关闭线程池, 则可以使用 awaitTermination 方法.

AbstractExecutorService

简介

该类是ExecutorService的基础实现, 对现 submit invokeAny invokeAll 等方法进行的简单的实现.

对Future进行了再次封装, 使用RunnableFuture来间接的替换了Future.

submit

此方法用于向线程池中提交一个任务并返回一个 Future,并通过 Future 来一步通知 task 的完成情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public <T> Future<T> submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
// 包装 Runnable
RunnableFuture<T> ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}

public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
// 包装Callable
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}

从代码可以看出重载的 submit 都对参数进行了包装且类型为RunnableFuture,最终都调用了 execute 方法。

查看 newTaskFor 方法看看实际返回的 RunnableFuture 类型

1
2
3
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new FutureTask<T>(runnable, value);
}

FutureTask

简介

FutureTask是一个可操作的异步 Future 实现,提供了 Future 的基础实现,包含了启动,取消,查看,获取等操作。

特性/作用