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

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

基本框架

这里写图片描述

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

1. Executor

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

以下是Executor接口的源码:

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

2. ExecutorService

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

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

以下是ExecutorService接口的源码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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

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

最后

以上就是神勇吐司最近收集整理的关于线程池原理(一):基本框架基本框架的全部内容,更多相关线程池原理(一)内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部