1. 程式人生 > >執行緒池原理–執行器ExecutorService

執行緒池原理–執行器ExecutorService

文章目錄


執行緒池原理–總索引

執行緒池原理–執行器ExecutorService

ExecutorService 也是一個介面,繼承Executor介面。

java interface ExecutorService extends Executor

相關方法

shutdown

  • shutdown: 當執行緒池呼叫該方法時,執行緒池的狀態則立刻變成SHUTDOWN狀態,此時呼叫isShutdown()會返回true。此時,則不能再往執行緒池中新增任何任務,否則將會丟擲RejectedExecutionException異常。但是,此時執行緒池不會立刻退出,直到新增到執行緒池中的任務都已經處理完成,才會退出。
  • shutdownNow : 執行該方法,執行緒池的狀態立刻變成STOP狀態,此時呼叫isShutdown()會返回true,並試圖停止所有正在執行的執行緒,不再處理還在池佇列中等待的任務,當然,它會返回那些未執行的任務。此時,則不能再往執行緒池中新增任何任務,否則將會丟擲RejectedExecutionException異常。它試圖終止執行緒的方法是通過呼叫Thread.interrupt()方法來實現的,但是大家知道,這種方法的作用有限,如果執行緒中沒有sleep 、wait、Condition、定時鎖等應用, interrupt()方法是無法中斷當前的執行緒的。所以,ShutdownNow()並不代表執行緒池就一定立即就能退出,它可能必須要等待所有正在執行的任務都執行完成了才能退出。
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();

awaitTermination()等待執行緒池中的任務執行完成,可以設定超時時間,直到遇到這三種情況才會退出,
第一種.超時時間到。
第二種.所有的任務執行完後。
第三種.當前執行緒遇到中斷。

@return {@code true} if this executor terminated and
     *  {@code false} if the timeout elapsed before termination
boolean
awaitTermination(long timeout, TimeUnit unit)

submit

用於提交執行緒任務,執行緒任務可以是Callable或者Runnable介面的實現類。Future介面提供方法來檢測任務是否被執行完,等待任務執行完獲得結果。也可以設定任務執行的超時時間,這個設定超時的方法就是實現Java程式執行超時的關鍵。

<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);

批量提交任務

這四個方法都是批量提交任務,並返回結果。都會阻塞,invokeAll直到所有任務執行完畢才會退出阻塞狀態。invokeAny只要有一個任務執行完畢就會退出阻塞狀態。不過也可以設定超時時間。
如果發生任何異常,所有的任務都會被取消。

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;  
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit)
        throws InterruptedException; 

<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;
 <T> T invokeAny(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;