Android執行緒篇(四)深入理解Java執行緒池(二)

Android開發者社群發表於2017-12-21

Android執行緒篇(四)深入理解Java執行緒池(二)

“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()方法來實現的,但是大家知道,這種方法的作用有限,如果執行緒中沒有sleepwaitCondition、定時鎖等應用, interrupt()方法是無法中斷當前的執行緒的。所以,shutdownNow()並不代表執行緒池就一定立即就能退出,它可能必須要等待所有正在執行的任務都執行完成了才能退出。

還有其他方法:getQueue()getPoolSize()getActiveCount()getCompletedTaskCount()等獲取與執行緒池相關屬性的方法,有興趣的朋友可以自行檢視原始碼。

到這裡AbstractExecutorService的衣服已經扒完了,我感覺到了個無底洞,知識點太多了!!!博主水平有限,好些東西也是一知半解,如有不當之處還望大家指正……

寫部落格真的是一件耗費精力的事情,大家且行且珍惜,下篇講什麼呢?讓我回去好好思考一下……

相關文章