线程池作用
线程复用,减少频繁创建线程和销毁线程所耗费的时间
ThreadPoolExecutor参数说明
corePoolSize
核心池大小, 当有任务来滞后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize滞后,就会把到达的任务方到缓存队列当中。
MaximumPoolSize
线程池最大线程数,表示最多能创建多少个线程
keepAliveTime
表示线程没有任务执行时最多保持多久会终止
unit
参数keepAliveTime的时间单位
workQueue
一个阻塞队列,用来存储等待执行的任务,可选值如下
- ArrayBlockingQueue
- LinkedBlockingQueue
- SynchronousQueue
threadFactory
线程工厂,主要用来创建线程
handler
表示当拒绝处理任务时的策略,有以下4种取值
- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
- ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
- ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
线程池状态
Running
创建线程池后,初始时,线程池处于Running状态
Shutdown
调用了shutdown()方法后,处于该状态,此时线程池不能接受新的任务,它会等待所有任务执行完毕
Stop
调用shutdownNow()方法,处于该状态,不能接受新任务,并且会去尝试终止正在执行的任务
Terminated
处于Shutdown或者Stop状态,并且所有工作线程已经销毁,任务缓存队列已经清空或执行结束后,线程池被标记为该状态
常用线程池
Executors.newCachedThreadPool();
将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。
Executors.newSingleThreadExecutor();
将corePoolSize和maximumPoolSize都设置为1,使用的LinkedBlockingQueue
Executors.newFixedThreadPool(int);
创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue