概述
现代机器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
线程池的静态工厂,通过该静态工厂返回常用的线程池。后面会专门说明。
最后
以上就是神勇吐司为你收集整理的线程池原理(一):基本框架基本框架的全部内容,希望文章能够帮你解决线程池原理(一):基本框架基本框架所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复