线程和任务的本质
在Java中,所谓的线程池中的“线程”,其实是被抽象为了一个静态内部类Worker,它基于AQS实现,存放在线程池的HashSet<Worker> workers
成员变量中;
而需要执行的任务则存放在成员变量workQueue(BlockingQueue<Runnable> workQueue)
中。这样,整个线程池实现的基本思想就是:从workQueue中不断取出需要执行的任务,放在Workers中进行处理。
线程池
Java 中的线程池是通过 java.util.concurrent
包中的 Executor
框架来实现的。线程池可以有效地管理和复用线程,以提高多线程任务的执行效率和资源利用率。
以下是线程池的简要介绍:
- 线程池接口和实现类:
-
Executor
接口是线程池的顶层接口,定义了执行任务的方法。 -
ExecutorService
接口继承自Executor
,扩展了一些管理线程池的方法,例如提交任务、终止线程池等。 -
ThreadPoolExecutor
是ExecutorService
接口的主要实现类,提供了灵活的线程池实现,可以根据需求自定义线程池的核心线程数、最大线程数、任务队列等参数。
- 线程池的工作原理:
- 线程池内部维护了一组可重用的线程,这些线程在需要执行任务时被动态调度。
- 当有任务提交到线程池时,线程池会根据配置的参数判断是否创建新的线程来执行任务。
- 如果当前线程池中的线程数未达到核心线程数,则创建新线程来执行任务。
- 如果当前线程池中的线程数已达到核心线程数,任务会被放入任务队列进行等待。
- 如果任务队列已满,且当前线程数未达到最大线程数,则创建新线程来执行任务。
- 如果当前线程数已达到最大线程数,且任务队列也已满,则根据线程池的拒绝策略来处理无法执行的任务。
- 线程池的参数和配置:
- 核心线程数(corePoolSize):线程池中保持的最小线程数,即使线程处于空闲状态也不会被回收。
- 最大线程数(maximumPoolSize):线程池中允许的最大线程数,包括核心线程数和非核心线程数。
- 任务队列(workQueue):用于存放待执行任务的队列,可以是有界队列(如
ArrayBlockingQueue
)或无界队列(如LinkedBlockingQueue
)。 - 线程池的拒绝策略(rejectedExecutionHandler):当线程池无法执行新任务时的处理策略,例如抛出异常、丢弃任务等。
- 空闲线程的存活时间(keepAliveTime):当线程池中的线程数超过核心线程数时,空闲线程的最大存活时间。