目前线程池的使用模式是生产者-消费者模式,线程池的使用方是生产者,线程池本身是消费者
Java中的线程池
Java中最核心的就是ThreadPoolExecutor,他强调的是Executor不是池化
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
-
corePoolSize : 表示线程池保有的最小线程数。
-
maximumPoolSize : 表示线程池创建的最大线程数。线程不能无限制的增加,最多增加到maximumPoolSize个,闲暇时不能减少个数少于corePoolSize;
-
keepAliveTime & unit : 一个线程空闲了keepAliveTime & unit 这么久没有执行任务,而且线程数大于corePoolSize 那么这个线程就会被回收
-
workQueue : 工作队列
-
threadFactory : 如何自定义如何创建线程
-
handler : 通过这个参数可以自定义拒绝策略,如果线程池中的所有线程都在工作,并且工作队列已经满了,此时提交任务就会被决绝接受,ThreadPoolExecutor 四种执行策略
- CallerRunsPolicy : 提交任务的线程自己去执行
- AbortPolicy : 默认决绝策略,会抛出RejectedExecutionException
- DiscardPolicy : 直接丢弃任务
- DiscardOldestPolicy : 丢弃最老的任务,把最早进入工作队列的任务丢弃
线程池使用注意
- 不建议使用 Executors 创建线程池 使用的工作队列是无界,容易导致OOM
- 默认拒绝策略要慎重使用
- 使用 execute 提交任务时,任务执行过程中的运行时异常要按需捕获并处理
