线程池

线程池作用

线程复用,减少频繁创建线程和销毁线程所耗费的时间

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