執行者

Executor是實現Runnable任務啟動的類的基接口。這有助於添加任務以及如何啟動它。

ExecutorService是一個接口,它擴展了Executor 的屬性,它描述了用於運行RunnableCallable任務的服務。提交方法接受CallableRunnable形式的任務作為,並使用 Future 作為返回值,通過它可以得到結果。

invokeAll方法負責執行任務,返回任務列表及其狀態和完成結果。

invokeAny方法負責執行任務,返回成功完成任務的結果(即不拋出異常),如果有的話。

ScheduledExecutorService - 此接口添加了以特定延遲或特定週期運行掛起任務的能力。

AbstractExecutorService是一個抽像類,用於構造一個 ExecutorService 'a. 裡面有submit invokeAll invokeAny方法的實現。該類繼承ThreadPoolExecutor ScheduledThreadPoolExecutorForkJoinPool

public static void main(String[] args) {
   ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
   Callable<String> task = () -> {
       System.out.println(Thread.currentThread().getName());
       return Thread.currentThread().getName();
   };
   scheduledExecutorService.schedule(task, 10, TimeUnit.SECONDS);
   scheduledExecutorService.shutdown();
}

線程池執行器

Executors是一個用於創建ThreadPoolExecutor ScheduledThreadPoolExecutor的工廠類。如果您需要創建其中一個池,那麼這個工廠正是您所需要的。它包含不同的適配器 Runnable-Callable、PrivilegedAction-Callable、PrivilegedExceptionAction-Callable 等。具有用於創建不同ThreadPool 的靜態方法。

ThreadPoolExecutor - 實現ExecutorExecutorService接口 並將任務創建與任務執行分開。我們需要實現Runnable對象並將它們發送給執行器,而ThreadPoolExecutor負責它們的執行、實例化並與線程一起工作。

ScheduledThreadPoolExecutor - 除了ThreadPoolExecutor方法之外,它還創建了一個線程池,可以安排命令在給定延遲後執行或定期執行。

線程工廠是一個按需創建新線程的對象。我們需要將一個實例傳遞給Executors.newSingleThreadExecutor(ThreadFactory threadFactory)方法。

ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() {
 @Override public Thread newThread(Runnable r) {
Thread thread = new Thread(r, "MyThread");
thread.setPriority(Thread.MAX_PRIORITY);
 return thread; }
 });

RejectedExecutionHandler - 允許您為由於某種原因無法通過ThreadPoolExecutor執行的任務定義處理程序。當沒有空閒流或服務關閉或關閉時會發生這種情況。

ThreadPoolExecutor類中有幾個標準實現:

  • CallerRunsPolicy - 在調用線程上運行任務;
  • AbortPolicy - 拋出異常;
  • DiscardPolicy——忽略任務;
  • DiscardOldestPolicy - 從隊列中刪除最早的未啟動任務,然後再次嘗試添加新任務。

完工服務

CompletionService是一個服務接口,將啟動異步任務和獲取結果解耦。添加任務有submit方法,獲取已經完成任務的結果使用阻塞take和非阻塞poll

ExecutorCompletionService是任何實現Executor接口的類的包裝器,例如ThreadPoolExecutorForkJoinPool。當需要從啟動任務和控制其執行的方法中抽像出來時使用。

如果有完成的任務,我們就把它們拉出來。如果沒有任務,那麼我們會掛起直到完成。該服務在其核心使用 LinkedBlockingQueue,但您可以傳入任何 BlockingQueue 實現。