【Java】线程池的那些事儿
程序员文章站
2022-04-30 23:44:44
...
概念
- 线程池管理器:创建并管理线程池(创建线程池,销毁线程池,添加新任务)
- 工作线程:指线程池中的线程,在没有任务时处于等待状态,有新任务时被重新调度
- 任务接口:只有实现该接口,才能被工作线程调度,主要规定了任务的入口,任务执行后的收尾工作,任务的执行状态等
- 任务队列:提供一种缓冲机制,用于存放没有处理的任务
线程池在JDK中的API
public interface ExecutorService extends Executor {
/**
* 关闭线程池,之前提交的任务都会执行,但不会接收新的任务
*/
void shutdown();
/**
* 停止所有正在执行的任务,返回等待执行任务的list
*/
List<Runnable> shutdownNow();
/**
* 判断线程池是否关闭
*/
boolean isShutdown();
/**
* 判断线程池中所有任务是否都已执行完
*/
boolean isTerminated();
/**
* 检测ExecutorService是否已关闭
*/
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
/**
* 提交一个用于执行的任务,返回一个Future对象,执行结果为result
*/
<T> Future<T> submit(Runnable task, T result);
/**
* 提交一个用于执行的任务,返回一个Future对象,执行结果为null
*/
Future<?> submit(Runnable task);
/**
* 执行给定的任务集合
*/
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
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;
}
线程池工具类 —— Executors
// 创建一个固定大小,任务队列容量无限制的线程池。核心线程数 = 最大线程数
java.util.concurrent.Executors#newFixedThreadPool(int)
// 创建一个大小无限制的缓冲线程池,任务队列是一个同步队列
// 当任务加到线程池中,如果有空闲线程,则通过空闲线程执行,空闲线程超过60s,会被销毁释放
// 线程数随任务多少变化,适用于执行耗时较小的异步任务
java.util.concurrent.Executors#newCachedThreadPool()
// 单一线程池,只有一个线程执行*任务队列,任务按照加入的顺序依次执行
java.util.concurrent.Executors#newSingleThreadExecutor()
// 能定时执行任务的线程池,核心线程数通过参数决定
java.util.concurrent.Executors#newScheduledThreadPool(int)
线程池执行任务的过程
- 判断是否达到核心线程数量:如果没达到,创建新的工作线程
- 如果达到了核心线程数量,判断工作队列是否已满:如果没满,将新提交的任务存储在工作队列
- 如果工作队列已满,判断是否达到线程池最大数量:如果没达到,创建新的工作线程
- 如果达到了线程池最大数量,执行拒绝策略
下一篇: ps人物照驼背怎么进行校正?