執行者
Executor是實現Runnable任務啟動的類的基接口。這有助於添加任務以及如何啟動它。
ExecutorService是一個接口,它擴展了Executor 的屬性,它描述了用於運行Runnable或Callable任務的服務。提交方法接受Callable或Runnable形式的任務作為,並使用 Future 作為返回值,通過它可以得到結果。
invokeAll方法負責執行任務,返回任務列表及其狀態和完成結果。
invokeAny方法負責執行任務,返回成功完成任務的結果(即不拋出異常),如果有的話。
ScheduledExecutorService - 此接口添加了以特定延遲或特定週期運行掛起任務的能力。
AbstractExecutorService是一個抽像類,用於構造一個 ExecutorService 'a. 裡面有submit、 invokeAll、 invokeAny方法的實現。該類繼承ThreadPoolExecutor、 ScheduledThreadPoolExecutor和ForkJoinPool。
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 - 實現Executor和ExecutorService接口 並將任務創建與任務執行分開。我們需要實現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接口的類的包裝器,例如ThreadPoolExecutor或ForkJoinPool。當需要從啟動任務和控制其執行的方法中抽像出來時使用。
如果有完成的任務,我們就把它們拉出來。如果沒有任務,那麼我們會掛起直到完成。該服務在其核心使用 LinkedBlockingQueue,但您可以傳入任何 BlockingQueue 實現。
GO TO FULL VERSION