作者:尕心疼TammyY | 来源:互联网 | 2023-09-11 20:19
为什么要使用线程池我们在工作中或多或少都使用过线程池。但是为什么要使用线程池呢?从它的名称中我们就可以猜到,线程池是使用了一种池化技术(PoolingTechnology)。和很多
为什么要使用线程池
我们在工作中或多或少都使用过线程池。但是为什么要使用线程池呢?从它的名称中我们就可以猜到,线程池是使用了一种池化技术(Pooling Technology)。和很多其他池化技术一样,都是为了更高效的利用资源,例如链接池,内存池等。
数据库链接是一种很昂贵的资源,创建和销毁都需要付出高昂的代价。为了避免频繁地创建数据库链接,所以产生了链接池技术。优先在池子中创建一批数据库链接,当有需要访问数据库时,直接到池子中去获取一个可用的链接,使用完了之后再归还到链接池中去。
同样的,线程也是一种很宝贵的资源,并且也是一种有限的资源,创建和销毁线程也同样需要付出不菲的代价。我们所有的代码执行都是由一个一个的线程支撑起来的,如今的芯片架构也决定我们必须编写多线程执行的程序,以获得最高的程序性能。
那么怎样高效地管理多线程之间的分工与协作就成了一个关键问题,Doug Lea大神为我们设计并实现了一款线程池工具,通过该工具就可以实现多线程的能力,并实现任务的高效执行与调度。
为了正确合理地使用线程池工具,我们有必要对线程池的原理进行了解。
线程池原理主要有三个方面:线程池状态、重要属性和工作流程。
线程池状态
首先线程池是有状态的,这些状态标识这个线程池内部的一些运行情况。线程池的开启到甘比的过程就是线程池状态的一个流转的过程。
线程池共有5种状态:
运行状态(RUNNING):此状态下,线程池可以接受新的任务,也可以处理阻塞队列中的任务。执行shutdown()方法可进入待关闭(SHUTDOWN)状态,执行shutdownNow()方法可进入停止(STOP)状态。
待关闭状态(SHUTDOWN):此状态下,线程池不再接受新的任务,继续处理阻塞队列中的任务。当阻塞队列中的任务为空,且工作线程数为0的时候,进入整理(TIDYING)状态。
停止状态(STOP):此状态下,线程池不接受新任务,也不处理阻塞队列中的任务,反而会尝试结束执行中的任务。当工作线程数为0时,进入整理(TIDYING)状态。
整理状态(TIDYING):此状态下,所有任务都已经执行完毕,且没有工作线程。执行terminated()方法进入终止(TERMINATED)状态。
终止状态(TERMINATED):此状态下,线程池完全终止,并完成了所有资源的释放。
重要属性
一个线程池的核心参数有很多,每个参数都有着特殊的作用,各个参数聚合再一起后将完成整个线程池的完整工作。
线程状态和工作线程数量