“Android開發者社群”微信群期待各位加入,我們一起“摳腚”,一起進步,一起探討技術……
微信ID:393795397 掘金主頁:Android開發者社群
上面文章我們發現,ThreadPoolExecutor
繼承自AbstractExecutorService
,這篇文章我們就來扒光它的衣服……
來來來,先看看AbstractExecutorService
原始碼:
public abstract class AbstractExecutorService implements ExecutorService
複製程式碼
發現:AbstractExecutorService
實現了ExecutorService
介面,來看看ExecutorService
原始碼:
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
<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;
}
複製程式碼
而ExecutorService
又是繼承了Executor
介面,我們看一下Executor
介面的實現:
public interface Executor {
/**
* Executes the given command at some time in the future. The command
* may execute in a new thread, in a pooled thread, or in the calling
* thread, at the discretion of the {@code Executor} implementation.
*
* @param command the runnable task
* @throws RejectedExecutionException if this task cannot be
* accepted for execution
* @throws NullPointerException if command is null
*/
void execute(Runnable command);
}
複製程式碼
哈哈,衣服扒了一半了,到這裡我們得出結論,ThreadPoolExecutor
繼承自AbstractExecutorService
,AbstractExecutorService
又實現了ExecutorService
介面,ExecutorService
介面又繼承了Executor
介面。
Executor
介面裡面只宣告瞭一個方法execute(Runnable)
,返回值為void
,引數為Runnable
型別,從字面意思可以理解,就是用來執行傳進去的任務的;
然後ExecutorService介面繼承自Executor介面,並且宣告瞭一些方法:submit
提交、invokeAll
呼叫所有、invokeAny
呼叫任何一個以及shutDown
關閉執行緒池等等等等;
抽象類AbstractExecutorService
實現了ExecutorService
介面,實現了ExecutorService
中宣告的方法;
ThreadPoolExecutor
繼承了AbstractExecutorService
。
介紹下ThreadPoolExecutor
中幾個重要的方法:
-
execute()
:execute()
方法實際上是Executor
介面中宣告的方法,在ThreadPoolExecutor
進行了具體的實現,這個方法是ThreadPoolExecutor
的核心方法,通過這個方法可以向執行緒池提交一個任務,交由執行緒池去執行。 -
submit()
:submit()
方法是在ExecutorService
中宣告的方法,在AbstractExecutorService
就已經有了具體的實現,在ThreadPoolExecutor
中並沒有對其進行重寫,這個方法也是用來向執行緒池提交任務的,但是它和execute()
方法不同,它能夠返回任務執行的結果,去看submit()
方法的實現,會發現它實際上還是呼叫的execute()
方法,只不過它利用了Future
來獲取任務執行結果。 -
shutdown()
:當執行緒池呼叫該方法時,執行緒池的狀態則立刻變成SHUTDOWN狀態。此時,則不能再往執行緒池中新增任何任務,否則將會丟擲RejectedExecutionException
異常。但是,此時執行緒池不會立刻退出,直到新增到執行緒池中的任務都已經處理完成,才會退出。 -
shutdownNow()
:執行該方法,執行緒池的狀態立刻變成STOP狀態,並試圖停止所有正在執行的執行緒,不再處理還在池佇列中等待的任務,當然,它會返回那些未執行的任務。它試圖終止執行緒的方法是通過呼叫Thread.interrupt()
方法來實現的,但是大家知道,這種方法的作用有限,如果執行緒中沒有sleep
、wait
、Condition
、定時鎖等應用,interrupt()
方法是無法中斷當前的執行緒的。所以,shutdownNow()
並不代表執行緒池就一定立即就能退出,它可能必須要等待所有正在執行的任務都執行完成了才能退出。
還有其他方法:getQueue()
、getPoolSize()
、getActiveCount()
、getCompletedTaskCount()
等獲取與執行緒池相關屬性的方法,有興趣的朋友可以自行檢視原始碼。
到這裡AbstractExecutorService
的衣服已經扒完了,我感覺到了個無底洞,知識點太多了!!!博主水平有限,好些東西也是一知半解,如有不當之處還望大家指正……
寫部落格真的是一件耗費精力的事情,大家且行且珍惜,下篇講什麼呢?讓我回去好好思考一下……