【JUCソースコード】スレッドプール:ThreadPoolExecutor(1)継承関係分析

スレッドプールシリーズ:

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;
    }
}

おすすめ

転載: blog.csdn.net/weixin_43935927/article/details/113966340