Android线程篇(四):深入理解Java线程池(二)

上面文章我们发现,ThreadPoolExecutor 继承自AbstractExecutorService,这篇文章我们就来扒光它的衣服……
来来来,先看看AbstractExecutorService源码:

public abstract class AbstractExecutorService implements ExecutorService 

发现:AbstractExecutorService实现了ExecutorService接口,来看看ExecutorService源码:

public interface ExecutorService extends Executor {
    void shutdown();
    List shutdownNow();
    boolean isShutdown();
    boolean isTerminated();
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;
     Future submit(Callable task);
     Future submit(Runnable task, T result);
    Future submit(Runnable task);
     List> invokeAll(Collection> tasks)
        throws InterruptedException;
     List> invokeAll(Collection> tasks,
                                  long timeout, TimeUnit unit)
        throws InterruptedException;
     T invokeAny(Collection> tasks)
        throws InterruptedException, ExecutionException;
     T invokeAny(Collection> 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的衣服已经扒完了,我感觉到了个无底洞,知识点太多了!!!博主水平有限,好些东西也是一知半解,如有不当之处还望大家指正……

写博客真的是一件耗费精力的事情,大家且行且珍惜,下篇讲什么呢?让博主回去好好思考一下……

你可能感兴趣的:(Android线程篇(四):深入理解Java线程池(二))