关于线程池参数的选择
秋水 Lv5

常见的线程池定义方法

  1. FixedThreadPool:
    • 场景:适用于处理固定数量的并发任务,例如服务器处理固定数量的请求线程。
  2. CachedThreadPool:
    • 场景:适用于执行大量短期异步任务,例如处理异步 I/O 操作。
  3. SingleThreadExecutor:
    • 场景:适用于需要保证任务按顺序执行的场景,例如日志记录。
  4. ScheduledThreadPool:
    • 场景:适用于需要定时或周期性执行任务的场景,例如定时任务调度。

自定义ThreadPoolExecutor的各个参数

  • **corePoolSize**(20):

    • 核心线程数,当有新任务到达时,即使这些线程是空闲的,也不会被销毁。
  • **maximumPoolSize**(100):

    • 线程池中允许的最大线程数。当任务队列已满时,只有超过核心线程数的线程会根据需要创建和销毁。
  • **keepAliveTime**(5):

    • 线程池中超过 corePoolSize 的空闲线程在终止前等待新任务的最长时间。
  • **unit**(TimeUnit.SECONDS):

    • keepAliveTime 的时间单位,此处为秒。
  • **workQueue**(new LinkedBlockingDeque<>(40)):

    • 用于存储等待执行任务的队列。LinkedBlockingDeque 是一个双端阻塞队列,容量为 40。
  • **threadFactory**(Executors.defaultThreadFactory()):

    • 线程工厂,用于创建新线程。你可以使用 Executors.defaultThreadFactory() 提供的默认工厂,也可以自定义一个 ThreadFactory 实现来配置新线程的创建方式(例如设置线程名称、线程优先级、是否是守护线程等)。
  • **handler**(new ThreadPoolExecutor.CallerRunsPolicy()):

    • 拒绝策略,当线程池和队列都满了,无法处理新的任务时,选择如何处理新提交的任务。

      ThreadPoolExecutor

      提供了四种内置的拒绝策略:

      • **AbortPolicy**:默认策略,直接抛出 RejectedExecutionException 异常。
      • **CallerRunsPolicy**:调用者运行策略,调用执行任务的线程自己来运行这个任务。
      • **DiscardPolicy**:丢弃策略,直接丢弃无法处理的任务。
      • **DiscardOldestPolicy**:丢弃最旧任务策略,丢弃队列中最旧的未处理任务,然后尝试重新提交新任务。
  • Post title:关于线程池参数的选择
  • Post author:秋水
  • Create time:2024-07-06 19:36:33
  • Post link:tai769.github.io2024/07/06/关于线程池参数的选择/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.