[转帖]JAVA多线程面试--Executor框架_招聘求职_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  生活服务区 »  招聘求职 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2454 | 回复: 0   主题: [转帖]JAVA多线程面试--Executor框架        上一篇   下一篇 
liuliying930406
注册用户
等级:中校
经验:2027
发帖:210
精华:0
注册:2018-10-9
状态:离线
发送短消息息给liuliying930406 加好友    发送短消息息给liuliying930406 发消息
发表于: IP:您无权察看 2018-10-24 15:09:27 | [全部帖] [楼主帖] 楼主

转自公众号自由职客平台


Executor框架的两级调度模型

在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程。

Java线程启动时会创建一个本地操作系统线程,当Java线程终止时,这个操作系统线程也会被回收。操作系统会调用所有线程并将他们分配给可用的CPU。可以将此种模式分为两层,在上层,Java多线程程序通常把应用程序分解为若干任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程,在底层,操作系统内核将这些线程映射到硬件处理器上。

两级调度模型的示意图:

image.png

Executor框架的结构

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

任务: 包括被执行的任务需要实现的接口:Runable 接口、Callable接口;

任务的执行: 包括任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。

Executor框架有两个关键类实现了ExecutorService接口:

ThreadPoolExecutor

ScheduledThreadPoolExecutor

ForkJoinPool;

任务的异步计算结果: 包括Future接口和实现Future接口的FutureTask类、ForkJoinTask类。

框架的类与接口:

image.png

注意一下:

此图不完整,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接口的对象。



该贴被liuliying930406编辑于2018-10-24 15:19:44



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册