Java多线程面试准备——聊聊Executor框架

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Java多线程面试准备——聊聊Executor框架

点击上方“好好学java”,选择“置顶公众号”

优秀学习资源、干货第一时间送达!

 精彩内容 

Executor框架的两级调度模型

在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当Java线程终止时,这个操作系统线程也会被回收。操作系统会调用所有线程并将他们分配给可用的CPU。

可以将此种模式分为两层,在上层,Java多线程程序通常把应用程序分解为若干任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。

两级调度模型的示意图:

Executor框架的结构

Executor框架主要由3大部分组成:

  • 任务: 包括被执行的任务需要实现的接口:Runable 接口、Callable接口;- 任务的执行: 包括任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架有两个关键类实现了ExecutorService接口:ThreadPoolExecutor 和 ScheduledThreadPoolExecutor、ForkJoinPool;- 任务的异步计算结果: 包括Future接口和实现Future接口的FutureTask类、ForkJoinTask类。
    框架的类与接口:

注意一下: 此图不完整,Executor框架的成员还包括: CompletionService ExecutorCompletionService ForkJoinTask、ForkJoinPool

Executor框架的成员介绍

1、Runnable接口 和 Callable接口

Runnable接口和Callable接口的实现类,都可以被ThreadPoolExecutor或Scheduled-ThreadPoolExecutor执行。它们之间的区别是Runnable不会返回结果,而Callable可以返回结果。

除了可以自己创建实现Callable接口的对象外,还可以使用工厂类Executors来把一个Runnable包装成一个Callable。


//Executors方法
public static Callable<Object> callable(Runnable task);
public static <T> Callable<T> callable(Runnable task, T result);
2、Executor、ExecutorService、AbstractExecutorService、ScheduledExecutorService

Executor 接口: 是Executor框架的基础,它将任务的提交与任务的执行分离开来。ExecutorService 接口: 扩展了Executor接口,提供了管理终止的方法(shutdown( ) ,etc),以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。AbstractExecutorService 类: 提供 ExecutorService 执行方法的默认实现。ScheduledExecutorService 接口: 一个特殊的 ExecutorService,提供了 可安排在给定的延迟后运行或定期执行的命令。

3、ThreadPoolExecutor

ThreadPoolExecutor通常使用工厂类Executors来创建。Executors可以创建3种类型的ThreadPoolExecutor:SingleThreadExecutor、FixedThreadPool和CachedThreadPool。以下是这三种线程池的应用场景说明:

  • FixedThreadPool适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景,它适用于负载比较重的服务器。- SingleThreadExecutor适用于需要保证顺序地执行各个任务;并且在任意时间点,不会有多个线程是活动的应用场景。- CachedThreadPool是大小无界的线程池,适用于执行很多的短期异步任务的小程序,或者是负载较轻的服务器
    4、ScheduledThreadPoolExecutor

    ScheduledThreadPoolExecutor通常使用工厂类Executors来创建。Executors可以创建2种类    型的ScheduledThreadPoolExecutor,如下。
  • ScheduledThreadPoolExecutor:包含若干个线程的ScheduledThreadPoolExecutor。- SingleThreadScheduledExecutor:只包含一个线程的ScheduledThreadPoolExecutor。
    5、Future 接口

Future接口和实现Future接口的FutureTask类用来表示异步计算的结果。当我们把Runnable接口或Callable接口的实现类提交(submit)给ThreadPoolExecutor或ScheduledThreadPoolExecutor时,ThreadPoolExecutor或ScheduledThreadPoolExecutor会向我们返回一个FutureTask对象。下面是对应的API。


<T> Future<T> submit(Callable<T> task)
<T> Future<T> submit(Runnable task, T result)
Future<> submit(Runnable task)

有一点需要读者注意,到目前最新的JDK 8为止,Java通过上述API返回的是一个FutureTask对象。但从API可以看到,Java仅仅保证返回的是一个实现了Future接口的对象。在将来的JDK实现中,返回的可能不一定是FutureTask


作者:jinggod
出处:http://www.cnblogs.com/jinggod/p/8488648.html

阅****读

1. 

****2. ****

3. 

4.**** ****

附上热门QQ群,存放资源和历史资料,2000容量(低门槛付费群),长按二维码入群

原文地址:https://sihai.blog.csdn.net/article/details/109464870

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Java多线程面试准备——聊聊Executor框架


 上一篇
近两年火热的微服务springboot不同配置文件详细讲解 近两年火热的微服务springboot不同配置文件详细讲解
点击上方“好好学java”,选择“置顶公众号” 优秀学习资源、干货第一时间送达!  精彩内容  一、配置文件SpringBoot使用一个全局的配置文件,配置文件名是固定的 application.properties- applicati
2021-04-04
下一篇 
Windows下的Jupyter Notebook 安装与自定义启动(图文详解) Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
**1、Jupyter Notebook ****和 **pip 为了更加方便地写 Python 代码,还需要安装 Jupyter notebook。 利用 pip 安装 Jupyter notebook。 为什么要使用 Jupyter?参
2021-04-04