Executor

2021/01/08 posted in  并发工具

目前线程池的使用模式是生产者-消费者模式,线程池的使用方是生产者,线程池本身是消费者

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 : 丢弃最老的任务,把最早进入工作队列的任务丢弃





线程池使用注意

  1. 不建议使用 Executors 创建线程池 使用的工作队列是无界,容易导致OOM
  2. 默认拒绝策略要慎重使用
  3. 使用 execute 提交任务时,任务执行过程中的运行时异常要按需捕获并处理