线程池再理解

线程池参数

  • corePoolSize:线程池的核心线程数量
  • maximumPoolSize:线程池的最大线程数
  • keepAliveTime:当线程数大于核心线程数时,多余的空闲线程存活的最长时间
  • unit:时间单位
  • workQueue:任务队列,用来储存等待执行任务的队列
  • threadFactory:线程工厂,用来创建线程,一般默认即可-
    handler:拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务

线程池工作原理

在这里插入图片描述
在创建完线程池之后,默认情况下,线程池中并没有任何线程,等到有任务来才创建线程去执行任务。

当创建的线程数等于 corePoolSize 时,提交的任务会被加入到设置的阻塞队列中。当队列满了,会创建线程执行任务,直到线程池中的数量等于 maximumPoolSize。

当线程池中创建的线程数量超过设置的 corePoolSize,在某些线程处理完任务后,如果等待 keepAliveTime 时间后仍然没有新的任务分配给它,那么这个线程将会被回收。
在这里插入图片描述

计算线程数量

一般多线程执行的任务类型可以分为 CPU 密集型和 I/O 密集型,根据不同的任务类型,我们计算线程数的方法也不一样。

  • CPU 密集型任务
    这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N(CPU 核心数)+1,比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。
    一旦任务暂停,CPU 就会处于空闲状态,而在这种情况下多出来的一个线程就可以充分利用 CPU 的空闲时间。

  • I/O 密集型任务
    这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。因此在 I/O 密集型任务的应用中,我们可以多配置一些线程,具体的计算方法是 2N。

猜你喜欢

转载自blog.csdn.net/AIJXB/article/details/115237999