banner
RustyNail

RustyNail

coder. 【blog】https://rustynail.me 【nostr】wss://ts.relays.world/ wss://relays.world/nostr

ThreadPoolExecutor

ThreadPoolExecutor 是一个服务 (ExecutorService),用来执行被提交过来的任务(task)的。通常上,会把任务放到从线程池中的线程去执行。

而 ThreadPoolExecutor 可以有不同的线程池可以使用。通过不同的创建方法:Executors.new****ThreadPool()

  • newCachedThreadPool 没有边界,每次都新增一个线程
  • newFixedThreadPool 固定线程大小
  • newSingleThreadExecutor 单线程的线程池

core / maximum pool size#

当一个新的任务提交过来后(execute(runnable)),会根据MaximumPoolSizeCorePoolSize两个参数的设置来决定任务的去向。

如果当前的正在运行的线程数大于CorePoolSize而且小于MaximunPoolSize且当前的等待队列满了,就会创建一个线程。

也就是说,如果把这两个参数设置成一样的话,就相当于创建了一个 FixedThreadPool。而如果把MaximumPoolSize设置的很大的话,就相当于

创建了一个 CachedThreadPool。

Keep-alive times#

线程的存活时间,线程在没有工作的时候,会在经过这么后被释放。如果被设置成很大数的话,很久才能回收资源。不能为零。

拒绝策略#

如果 core pool size 和 maximum pool size 和 队列都满了,需要对刚加入的新任务进行处理。有几种处理方式。

  1. 直接在execute()的这个线程执行任务
  2. 抛出异常RejectedExecutionException
  3. 丢弃这个任务。
  4. 将最久(队列头处的那个)的一个线程丢弃。

这是提供的方式,也可以自己实现RejectedExecutionHandler接口。

new RejectedExecutionHandler() {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

    }
}

状态变换#

整个生命周期里,在 Running、Stop、Shutdown、Tiddying、Terminated 之间转换。

状态机

内部类#

worker#

用来执行 task 的。Service 的private boolean addWorker(Runnable firstTask, boolean core)根据状态创建 worker, 并执行。

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.