Answers:
线程池是一组预先实例化的空闲线程,它们随时可以进行工作。当要执行大量的短任务而不是少量的长任务时,这些优先于为每个任务实例化新线程。这样可以避免产生大量线程的开销。
实施会因环境而异,但简单来说,您需要以下内容:
Task
与execute()
该做的工作,然后返回方法。创建线程池时,它将实例化一定数量的线程以使其可用或根据实现的需要根据需要创建新的线程。
将池移交给a时Task
,它将从容器中获取一个线程(如果容器为空,则等待一个线程可用),将其移交给a Task
,并遇到障碍。这将导致空闲线程恢复执行,并调用给定的execute()
方法Task
。执行完成后,线程将自己移回池中以放入容器中以供重用,然后遇到其障碍,使自己进入睡眠状态,直到循环重复。
现实生活中的例子;
您有一个设施,那里有12个人在工作。该设施共有3个部分。厨房,洗手间和安全性。如果您不使用线程池技术,那么它就是这样工作的:所有12个人都将站在会议室中,如果新客户来自设施并要求任务,那么您将把人们分成几组并派他们去做,然后回到会议室。但是,在他们上班之前,有一个准备阶段。他们需要穿着正确的制服,装备某些设备,然后步行到该区域,完成工作并返回。因此,每次他们完成工作(线程结束)后,就需要回到会议室,脱下制服,取出设备并等待下一份工作。这些指的是创建线程上下文,它是操作系统的内存分配和跟踪信息。
如果使用线程池,那么在清晨,您将为厨房分配6个人,为卫生间分配2个人,为安全分配4个人。因此,他们每天只会做一次准备。即使厨房里没有顾客,那四个人也将在那里闲着,等待即将到来的任务。在厨房关闭(应用结束)之前,他们不需要回到会议室。这4个人位于Kitchen应用程序池中,可以快速提供服务。但是,您不能保证他们会整天工作,因为厨房可能会不时变得闲置。同样的逻辑也适用于洗手间和安全性。
在第一种情况下,您不会为任何任务浪费任何线程,但是为每个任务准备每个线程将花费大量时间。在第二篇文章中,您预先准备了线程,因此您不能保证将所有线程都用于所有任务,但是OS在很大程度上对其进行了优化,因此您可以放心地依赖它。