如何实现线程池?我一直在维基百科上读“线程池”,但我仍然不知道如何解决这个问题(可能是因为我不太明白线程池在简单的术语中是什么)。
有人能用通俗易懂的英语解释一下线程池是什么吗?怎么回答这个问题呢?
发布于 2012-11-04 16:53:54
线程池是一组托管线程,通常组织在队列中,执行任务队列中的任务。
每次需要异步执行时都要创建一个新的线程对象,这是非常昂贵的。在线程池中,只需将希望异步执行的任务添加到任务队列中,线程池负责为相应的任务分配可用的线程(如果有的话)。一旦任务完成,现在可用的线程就会请求另一个任务(假设还剩下任何任务)。
线程池可以帮助您避免创建或销毁更多线程,而不是真正需要的线程。
首先,我将创建一个包含线程队列和任务队列的类。然后实现一个方法,该方法将任务添加到任务队列中,然后从那里继续。显然,您还应该能够在线程池中设置允许的最大线程。
发布于 2017-02-24 21:28:01
现实生活范例;
你在那里有一个设施,有12个人在工作。这个设施有三个部分。厨房,洗手间和保安。如果你不使用线程池技术,这就是它的工作原理:所有12个人都会站在会议室里,如果新客户通过设备来要求任务,那么你会把人分成几个小组,派他们去做他们的工作,然后回到会议室。但是,在他们履行职责之前,还有一个准备阶段。他们需要穿着正确的制服,装备一定的设备,走到那个区域,完成工作,然后回来。因此,一旦他们完成他们的工作(线结束),他们需要步行回会议室,脱掉制服,拿出设备,等待下一个工作。这些都涉及到创建线程上下文,它的内存分配和跟踪信息的操作系统。对于操作系统来说,重新组织新线程需要的时间太长了。
如果您正在使用线程池,那么,在清晨,您将指派6人到厨房,2人到洗手间,4人的安全。所以,他们一天只做一次准备。即使厨房里没有顾客,那4个人也会在那里,无所事事地去做任何即将到来的任务。他们不需要回到会议室直到厨房关闭(应用程序结束)。这4个人在厨房的应用程序池,并准备好迅速服务。但是,你不能保证他们整天都在工作,因为厨房可能会时不时地变得空闲。同样的逻辑也适用于卫生间和保安。
在第一个场景中,您不会为任何任务浪费任何线程,但是为每个任务准备每个线程需要花费大量的时间。在第二种情况下,您预先准备了线程,因此不能保证您将在所有任务中使用所有线程,但是,OS对其进行了很好的优化,因此您可以安全地依赖它。
发布于 2012-11-04 16:29:23
在多线程应用程序中,线程池是应用程序可以使用的“可用线程池”。通常,例如.NET,它都是管理的,所以您只需分配任务,一旦线程空闲,它就会执行它。因此,为了实现线程池,我希望创建一个概念,在这个概念中,任务由空闲线程自动接收,而无需为每个任务创建显式线程。
https://softwareengineering.stackexchange.com/questions/173575
复制相似问题