我是靠谱客的博主 神勇吐司,最近开发中收集的这篇文章主要介绍线程池原理(一):基本框架基本框架,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

现代机器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

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

最后

以上就是神勇吐司为你收集整理的线程池原理(一):基本框架基本框架的全部内容,希望文章能够帮你解决线程池原理(一):基本框架基本框架所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部