线程池原理(一):基本框架
来源:互联网 发布:淘宝电子琴小天吏价 编辑:程序博客网 时间:2024/06/13 22:11
现代机器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
线程池的静态工厂,通过该静态工厂返回常用的线程池。后面会专门说明。
阅读全文
1 0
- 线程池原理(一):基本框架
- Java并发(4)深入分析java线程池框架及实现原理(一)
- 线程池的原理以及java的线程池框架
- 线程池的原理以及Java的线程池框架
- java.util.concurrent 多线程框架---线程池编程(一)
- Java基本线程机制(一)
- 线程的基本操作(一)
- 基本的线程机制(一)
- (一)基本的线程机制
- Java 线程池原理解析(一)
- JAVA线程池原理详解一
- Java线程(一)-概念与原理
- Java线程:概念与原理(一)
- Java线程:概念与原理(一)
- Sruts 笔记一(基本实现原理)
- AsyncTask异步任务线程框架(一)
- 深入浅出 Javascript API(一)--基本框架
- Signals框架介绍(一)基本用法
- butterknife总结(三)
- PAT_A 1040. Longest Symmetric String (25)
- C——指针一定要分配空间
- HDU 6118 度度熊的交易计划 (裸最小费用流)
- QGC瓦片地图
- 线程池原理(一):基本框架
- HDU
- maven项目springboot出问题
- spring整合ehcahce2实现方法返回值缓存
- Java中获取mysql连接的四种方式
- 最长公共子序列以及最长公共子字符串
- 古代密码
- HDU 2546 饭卡——背包 + 贪心
- 栈和队列的面试题Java实现