前言
实在高并发场景下,我的项目个别不会间接应用 Thread 类创立线程,而是应用线程池来创立并治理线程。对于程序员来说,学好线程池对于并发编程是十分重要的。
为什么要应用线程池
次要有以下三方面的起因:
- 频繁的创立 / 销毁线程须要耗费系统资源,线程须要从新被 cpu 从就绪到运行状态调度,须要产生 cpu 的上下文切换,效率非常低。
- 并发数量过多,可能会导致资源耗费过多,从而造成服务器解体。(次要起因)
- 能够对线程做对立治理。
ThreadPoolExecutor 参数
- int corePoolSize: 外围线程数
- int maximumPoolSize: 最大线程数
- long keepAliveTime: 超出 corePoolSize 后创立的线程的存活工夫
- TimeUnit unit: keepAliveTime 的工夫单位
- BlockingQueue workQueue: 阻塞队列,保护着期待执行的 Runnable 工作对象
- ThreadFactory threadFactory: 创立线程的线程工厂
执行过程:
- 当线程数小于外围线程数时,创立线程。
- 当线程数大于等于外围线程数,且工作队列未满时,将工作放入工作队列。
- 当线程数大于等于外围线程数,且工作队列已满时:
- 若线程数小于最大线程数,创立线程
- 若线程数等于最大线程数,执行回绝策略
回绝策略
线程池提供了 4 种回绝策略,别离如下:
- AbortPolicy:间接抛出异样,这也是默认的策略。。
- CallerRunsPolicy:应用调用者所在的线程来执行工作。
- DiscardOldestPolicy:抛弃队列中最靠前的工作并执行当前任务。
- DiscardPolicy:间接抛弃当前任务。
如何设置线程数
正当地设置外围线程数和最大线程数能够优化线程池的性能和响应工夫。倡议如下:
- 外围线程数 = CPU 外围数 + 1
- 最大线程数 = 外围线程数 * 2
- 如果工作执行工夫较长,能够适当减少最大线程数,以防止工作沉积在队列中无奈及时处理
总结
本文详解了线程池的概念以及执行流程,在生产过程中如何正当的应用还须要线上的验证,心愿本文对大家有帮忙!
本文由 mdnice 多平台公布