スレッドプールシリーズ:
- 【JUCソースコード】スレッドプール:ThreadPoolExecutor(1)継承関係分析
- [JUCソースコード]スレッドプール:ThreadPoolExecutor(2)の基礎となる構造解析
- [JUCソースコード]スレッドプール:ThreadPoolExecutor(3)ワーカーデザインのアイデアとソースコード分析
- [JUCソースコード]スレッドプール:タスク実行プロセスのThreadPoolExecutor(4)ソースコード分析
- [JUCソースコード]スレッドプール:ThreadPoolExecutor(5)の概要
- [JUCソースコード]スレッドプール:スレッドプール&Excutorsを作成するためのパラメーター設定のアイデア
- [JUCソースコード]スレッドプール:ThreadPoolに関するいくつかの質問
ThreadPoolExecutorのソースコードを見る前に、ThreadPoolExecutorの継承関係を見てみましょう。
1.エグゼキュータ
タスクを実行するためのexecuteメソッドを定義します。入力パラメーターは実行可能で、出力パラメーターはありません。
public interface Executor {
void execute(Runnable command);
}
2.ExecutorService
Executorの機能が弱すぎるExecutorServiceは、タスクの実行と管理の機能を強化します。メインコードは次のとおりです。
public interface ExecutorService extends Executor {
// 提交有返回值的任务,使用 get 方法可以阻塞等待任务的执行结果返回
<T> Future<T> submit(Callable<T> task);
// 提交没有返回值的任务,如果使用 get 方法的话,任务执行完之后得到的是 null 值
Future<?> submit(Runnable task);
// 给定任务集合,返回已经执行完成的 Future 集合,每个返回的 Future 都是 isDone = true 的状态
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
// 给定任务中有一个执行成功就返回,如果抛异常,其余未完成的任务将被取消
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
// 关闭,不会接受新的任务,也不会等待未完成的任务
// 如果需要等待未完成的任务,可以使用 awaitTermination 方法
void shutdown();
// 在超时时间内,等待剩余的任务终止
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
// executor 是否已经关闭了,返回值 true 表示已关闭
boolean isShutdown();
// 所有的任务是否都已经终止,是的话,返回 true
boolean isTerminated();
}
3.AbstractExecutorService
- Executorの多くの一般的な機能をカプセル化する抽象クラス
- いくつかのExecutorServiceメソッドを実装しました
public abstract class AbstractExecutorService implements ExecutorService {
// 将Callabbe,想要返回值的Runnable转化成Callable
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new FutureTask<T>(runnable, value);
}
// FutureTask(Runnable,T) -> RunnableFuture -> Runnable
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
return new FutureTask<T>(callable);
}
// submit调用的还是execute
// 只不过将Callable,要返回值的Runnable提前转化成了RunnableFuture
// 提交无返回值的任务
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
// ftask 其实是 FutureTask
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
// 提交有返回值的任务
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
// ftask 其实是 FutureTask
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
}