ThreadPoolExecutor 线程池详解


一. ThreadPoolExecutor 的介绍

ThreadPoolExecutor 的核心会用到实现了 AQS 中的独占式同步队列的 Worker,Worker 主要用于新建线程以及对线程状态的管理,其中 ThreadPoolExecutor 还会维护一个核心线程数,如果添加的线程数超过了核心线程数,则会将线程加入到 BlockingQueue 类型的等待队列中。


二. ThreadPoolExecutor 的使用

1. 创建线程池

ThreadPoolExecutor 的构造函数会有许多参数,每一个参数都需要大概的了解。

  • corePoolSize:核心线程数,只要提交任务就会新建一个线程,不管是否有空闲的线程存在都会新 建,直到执行任务的线程数到达核心线程数才不会再创建。使用 prestartAllCoreThreads() 方法会预先提前创建并启动线程。
  • maximumPoolSize:最大线程数,最大线程数等于核心线程数加上队列中的线程数。如果使用了无界队列,此项会无效。
  • keepAliveTime:队列中闲置线程的最大等待时间。
  • unit:等待时间的时间单位。
  • workQueue(BlockingQueue 类型):同步队列的类型,有多种队列可以选择。
  • threadFactory(ThreadFactory类型):用于创建线程的线程工厂,ThreadFactory 接口包含了一个 newThread() 方法,自定义实现此方法用来创建线程。
  • handler(RejectedExecutionHandler 类型):饱和策略,在队列已满的情况下,用来处理新任务的策略。
public ThreadPoolExecutor(int corePoolSize,  
                          int maximumPoolSize,  
                          long keepAliveTime,  
                          TimeUnit unit,  
                          BlockingQueue<Runnable> workQueue,  
                          ThreadFactory threadFactory,  
                          RejectedExecutionHandler handler) {
     
    if (corePoolSize < 0 ||  
        maximumPoolSize <= 0 ||  
        maximumPoolSize < corePoolSize ||  
        keepAliveTime < 0)  
        throw new IllegalArgumentException();  
    if (workQueue == null || threadFactory == null || handler == null)  
        throw new NullPointerException();  
    this.acc = System.getSecurityManager() == null ?  
            null :  
            AccessController.getContext();  
    this.corePoolSize = corePoolSize;  
    this.maximumPoolSize = maximumPoolSize;  
    this.workQueue = workQueue;  
    this.keepAliveTime = unit.toNanos(keepAliveTime);  
    this.threadFactory = threadFactory;  
    this.handler = handler;  
}

workQueue 等待队列

等待队列有四种类型可以选择。

  • ArrayBlockingQueue:基于数组的 FIFO (先进先出) 类型的有界队列
  • LinkedBlockingQueue:基于链表的 FIFO (先进先出) 类型的阻塞队列,构造函数中可以选择队列的大小,但是在 Executors 中使用的是无界队列。
  • SynchronousQueue:一个不储存元素的阻塞队列,后一个线程的插入操作必须等待前一个线程调用移除操作。
  • PriorityBlockingQueue:具有优先级的无界阻塞队列。

handler 饱和策略

饱和策略,在队列已满的情况下,用来处理新任务的策略。

  • AbortPolicy:默认策略,直接抛出异常。
  • CallerRunsPolicy:直接执行调用者的任务。
  • DiscardPolicy:不处理
  • DiscardOldestPolicy:去除队列中最近的一个任务,并执行当前任务。

2. 向线程池提交任务

向线程池提交任务分为两种,execute()submit()execute() 没有返回值,submit() 会返回一个 Future<?> 类型的对象,通过 Future<?>get() 可以获取任务的返回值。

  • execute()
executor.execute(() -> {
     
	// 运行程序
});
  • submit()
Future<?> future = executor
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ThreadPoolExecutorJava中的一个线程池实现类。它继承自ExecutorService接口,可以用来管理和执行线程任务。ThreadPoolExecutor线程池提供了更灵活的线程管理和任务调度的功能,并且可以根据需要进行配置。可以通过指定核心线程数、最大线程数、线程存活时间和任务队列等参数来创建和配置ThreadPoolExecutor线程池。 使用ThreadPoolExecutor线程池可以提供以下几个优点: 1. 降低线程创建和销毁的开销。线程池可以重用已经创建的线程,减少了频繁创建和销毁线程的开销。 2. 提高系统的响应速度。线程池可以并发执行多个任务,提高了系统的处理能力和响应速度。 3. 控制线程并发数量。通过设置线程池的核心线程数和最大线程数,可以控制系统的并发线程数量,避免资源耗尽和系统崩溃的风险。 4. 提供任务调度和管理。线程池可以将任务按照一定的策略和优先级进行调度和执行,方便管理任务的执行顺序和优先级。 总之,ThreadPoolExecutor线程池是一个灵活可配置的线程管理和任务调度工具,可以提高系统的并发处理能力和响应速度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [线程池ThreadPoolExecutor详解(整理详细)](https://blog.csdn.net/trusause/article/details/125747447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [ThreadPoolExecutor线程池的使用方法](https://download.csdn.net/download/weixin_38659648/12746355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞎叨叨的一天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值