目录
线程池是一种技术,使用线程池来管理维护线程,比手动创建更加安全,快捷,因为线程是一种稀
缺资源,无限制的过度创建,可能会威胁到系统的稳定性,同时线程的创建和销毁都会付出额外的
性能消耗,而线程池就像一个蓄水的池子,将线程都存放在里面,到需要的时候,可以直接去使
用。
在Java
标准库提供了如下几个类或接口,来操作并使用线程
ExecutorService
接口:来进行管理操作线程池;Executors
类:用于创建线程池的工具类;ThreadPoolExecutor
及其子类:线程池; - public class Pools {
- public static void main(String[] args) {
-
- // 根据任务调整线程的线程池
- ExecutorService pool1 = Executors.newCachedThreadPool();
-
- // 线程数固定的线程池
- ExecutorService pool2 = Executors.newFixedThreadPool(5);
-
- // 单线程的线程池
- ExecutorService pool3 = Executors.newSingleThreadExecutor();
-
- // 延迟执行的线程池
- ExecutorService pool4 = Executors.newScheduledThreadPool(2);
-
- }
-
- }
通过各个线程池的源码查看,他们获得或少都有着相同的参数
线程池的参数可分为:corePoolSize、maximumPoolSize、keepAliveTime、TimeUnit、
BlockingQueue、ThreadFactory 、RejectedExecutionHandler
核心线程数,也就是线程池中最小维护的线程池。
在 newFixedThreadPool 线程池中,核心线程是与最大线程数相同的,
在newCachedThreadPool 线程池中,核心线程数为0,
在newSingleThreadExecutor 线程中核心线程数为1,
在newScheduledThreadPool线程池中,核心线程数与传入的参数相同。
最大线程数,就是线程池中,最多可以维护的线程数。
在 newFixedThreadPool 线程池中,核心线程是与最大线程数相同的,都等于传入的参数
在newCachedThreadPool 线程池中,最大线程数等于Integer.MAX_VALUE,即 1247483647
在newSingleThreadExecutor 线程中,最大线程数等于1,
在newScheduledThreadPool线程池中,最大线程数与传入的参数相同。
在 newFixedThreadPool 线程池中,非核心线程可以存活时间为:0
在newCachedThreadPool 线程池中,非核心线程可以存活时间为:60 秒
在newSingleThreadExecutor 线程中,非核心线程可以存活时间为:0
在newScheduledThreadPool线程池中,非核心线程可以存活时间为:0
工作队列,或者说是等待队列,用来储存等待中的任务。
常见的等待队列有 :
在 newFixedThreadPool 线程池中,工作队列为:LinkedBlockingQueue
在 newCachedThreadPool 线程池中,工作队列为:SynchronousQueue
在 newSingleThreadExecutor 线程中,工作队列为:LinkedBlockingQueue
在 newScheduledThreadPool线程池中,工作队列为:DelayedWorkQueue
线程工厂,创建和销毁线程,以及设置线程的名称
常见的拒绝策略有:
在 newFixedThreadPool 线程池中,拒绝策略为:AbortPolicy
在 newCachedThreadPool 线程池中,拒绝策略为:AbortPolicy
在 newSingleThreadExecutor 线程中,拒绝策略为:AbortPolicy
在 newScheduledThreadPool线程池中,拒绝策略为:AbortPolicy