上面文章我们发现,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
的衣服已经扒完了,我感觉到了个无底洞,知识点太多了!!!博主水平有限,好些东西也是一知半解,如有不当之处还望大家指正……
写博客真的是一件耗费精力的事情,大家且行且珍惜,下篇讲什么呢?让博主回去好好思考一下……