Java 线程池详解(一):线程池实现原理及使用

为什么要使用线程池?

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在 Java 中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。

如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些 "池化资源" 技术产生的原因。比如数据库连接池,它在很大程度上减少了连接建立和释放带来的性能开销!

具体的来讲,我们来考虑这样一种场景,对于一个 web 项目,每次过来一个请求,都要在服务端创建一个新线程来处理请求,请求处理完成后销毁线程,我们将其简单的量化一下:

  • 创建线程耗时:T1
  • 处理请求耗时:T2
  • 销毁线程耗时:T3

那么对于处理这样的一个请求,总耗时便是 T = T1 + T2 + T3,那我们来想一想如果这个请求非常简单呢?(事实上,现在很多 web 接受的都是这样的短小且大量的请求!),T2 耗时很短,则 T1 + T3 > T2,这样使用多线程技术不但没有提高 CPU 的吞吐量,反而降低了。

可以看出 T1,T3 是多线程本身的带来的开销,我们渴望减少 T1,T3 所用的时间,从而减少总耗时 T 的时间。但一些线程的使用者并没有注意到这一点,所以在程序中频繁的创建或销毁线程,这导致 T1 和 T3 在 T 中占有相当比例。显然这是突出了线程的弱点(T1,T3),而不是优点(并发性)。

线程池技术的提出,正是为了解决上述的问题!它与数据库连接池是同样的道理,使用线程池技术有如下几个优点:

  • 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗
  • 提高响应速度: 当任务到达时,任务可以不需要等到线程创建就能立即执行
  • 提高线程的可管理性: 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。

 

线程池的实现原理

接下来我们来看一下,当向线程池提交一个任务之后,线程池是如何处理这个任务的,如下图所示
Java 线程池详解(一):线程池实现原理及使用_第1张图片

你可能感兴趣的:(Java 线程池详解(一):线程池实现原理及使用)