线程池原理(一):基本框架

来源:互联网 发布:淘宝电子琴小天吏价 编辑:程序博客网 时间:2024/06/13 22:11

现代机器CPU基本都是多核系统,利用多线程可以明显提高系统的效率,但是如果不控制线程的使用,会给系统带来严重的后果,因此,JDK提供了线程池供我们使用。有了线程池,每到达一个任务,从线程池调度一个空闲的线程来执行任务,避免了每次都要去创建线程带来的开销。

基本框架

这里写图片描述

上图是JAVA线程池的基本框架,整个线程池基本上是根据这些类来设计的。

1. Executor

Executor是执行者的意思,JAVA线程池中一个核心思想就是将任务执行和任务提交解耦。执行者可以创建一个新的线程、通过线程池或者执行者本身来执行提交的任务。

以下是Executor接口的源码:

public interface Executor {    //执行指定的任务,不一定在Executor本身所在的线程执行该任务,也可以通过新的线程或者线程池来执行。    //事实上,大部分情况都应该通过新的线程或者线程池执行该任务    void execute(Runnable command);}

2. ExecutorService

ExecutorService是执行者服务,实现了Executor接口,主要提供了两类方法:

  • 终止线程的方法
  • 能够获取任务执行结果的执行方法

以下是ExecutorService接口的源码:

public interface ExecutorService extends Executor {    /**    * 启动一次顺序关闭,执行已经提交的任务,但不接受新的任务    */    void shutdown();    /**    * 尝试终止正在执行的任务,终止正在等待的任务,返回正在等待执行的任务列表    * 没有办法保证能够停止正在运行的任务,如果线程不响应中断的话,这些线程可能永远不会终止    */    List<Runnable> shutdownNow();    //返回该执行者是否已经关闭    boolean isShutdown();    //如果关闭后所有任务都已完成,返回true    //只有先调用shotdown或shutdownNow,该方法才可能返回true    boolean isTerminated();    //收到shutdown请求后,该执行者阻塞,直到任务完成或者超时或者当前线程被中断    //如果该执行者正常终止返回true,如果超时返回false    //如果线程被中断,抛出中断异常    boolean awaitTermination(long timeout, TimeUnit unit)        throws InterruptedException;    /**    * 提交一个有返回值的任务,返回一个带有任务执行结果的对象    * 任务执行结果Future的get方法会阻塞,直到该任务执行完成    * 如果执行者不能调度执行该任务,抛出拒绝执行异常    */    <T> Future<T> submit(Callable<T> task);    /**    * 该方法和上面的方法类似,因为Runnable是没有返回值的,因此这里加了另一个参数result    * 表示任务的返回结果    */    <T> Future<T> submit(Runnable task, T result);    /**    * 提交一个没有返回值的任务,返回代表任务返回结果的Future对象    */    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;}

3. AbstractExecutorService

该类实现了ExecutorService接口,为线程池提供了默认实现,是线程池的基础骨架。

4. ThreadPoolExecutor

该类就是JAVA的线程池,继承了AbstractExecutorService。后面会专门解释该类,现在暂时不说明。

5. ScheduledExecutorService

该接口提供了延时和周期性的任务执行功能。后面会专门说明。

6. ScheduledThreadPoolExecutor

带延时和周期性任务执行的线程池。后面会专门说明。

7. Executors

线程池的静态工厂,通过该静态工厂返回常用的线程池。后面会专门说明。