《Java多线程编程实战》—— 第9章 Thread Pool(线程池)模式

一个系统中的线程相对于其所要处理的任务而言,是一种非常有限的资源。线程不仅在执行任务时需要消耗CPU时间和内存等资源,线程对象(Thread实例)本身以及线程所需的调用栈(Call Stack)也占用内存,并且Java中创建一个线程往往意味着JVM会创建相应的依赖于宿主机操作系统的本地线程(Native Thread)。因此,为每个任务创建一个线程,通常是一种奢侈而不现实的事情。常见的做法是复用一定数量的线程,执行不断产生的任务。
Thread Pool模式的核心思想是使用队列等待处理的任务进行缓存,并复用一定数量的工作者线程去取队列中的任务进行执行。

类图

好处:

  • 减少线程创建的开销,提高响应性。//事先创建一部分线程。
  • 封装了工作者线程生命周期管理。
  • 减少销毁线程的开销

ThreadPoolExecutor 工作队列的选择:

  • 有界队列:限定线程池中待执行任务的数量。需要限定线程池最大大小为一个合理有限值。有界工作队列加上有限数量的工作者线程可能导致死锁。有界队列适合任务之间相互独立的情况。
  • 无界队列:工作队列本身不限制线程池中等待运行的任务的数量,任务数取决于任务本身对资源的使用情况。无界队列可能导致系统的不稳定
  • 直接交接队列(SynchronousQueue):实际上不使用缓存空间。需要限定线程池最大大小为一个合理有限值

线程池大小调校:太大消耗资源,并增加上下文切换。太小无法充分利用CPU资源,吞吐率过低。合理的大小取决于任务的特性、系统资源状况以及任务所使用的稀缺资源状况等因素。
系统资源主要考虑CPU个数和JVM堆内存的大小。

猜你喜欢

转载自blog.csdn.net/wsjtwmy/article/details/84592003