线程池
ThreadPoolExecutor
线程池状态
七个构造方法参数
线程池中主要分为核心线程,救急线程,阻塞队列,核心线程会不断执行任务,任务执行完后会接着执行任务(一直存在),而救急线程是在阻塞队列满后,就会接下任务的线程(抢救),corePoolSize指定core thread的数量,而maximumPoolSize就是core thread和救急线程的总和。
keepalivetime、unit表示救急线程的生存时间和时间单位,救急线程在执行完任务后会等待keepalivetime指定的一段时间,然后销毁,直到下次阻塞队列满时重新创建。
workqueue在核心线程使用完后,就将任务放在阻塞队列等待。
threadfactory可以自定义一个,使用自己的命名方式。
handler当阻塞队列、救急线程、核心线程都是满的状态下,就会执行拒绝策略。
救急线程
创建救急线程的前提在选择了有界队列,当任务超过队列大小时就会创建救急线程,而如果选择无界就不存在救急线程。
四种拒绝策略
阻塞队列
BlockingQueue
executor不适用
在实际中不常用executor来创建线程池。
executor提供众多工厂方法创建个种用途的线程池(其实就是调用构造方法,将一些参数写好,另一些参数自定义)。
newfixedthreadpool
固定大小的线程池,这种线程池没有救急线程,同时使用无界的阻塞队列,可以放任意数量的任务。
newcachedthreadpool
只有一个核心线程,没有救急线程,阻塞使用无界的阻塞队列。
提交任务
submit
使用保护性暂停模式,会等待接收返回的结果。
invokeall
inovkeall会指定时间,时间过后还没拿到结果的就取消其他任务。
invokeany
只会将最先执行完的任务结果返回,并取消其他任务。
关闭线程池
shutdown
shutdownnow