如果您要限制并发线程的数量,最好的办法是经常预先创建所有线程(工作者)并让它们在无限循环中运行,等待队列中的工作。
然后主线程负责将工作项(在这种情况下为连接)添加到该队列以供工作人员处理。
这样做的优点是简单和速度。简单,因为您不必担心线程启动或停止,除了一次,它们始终在运行并为工作项提供服务。
出于同样的原因速度。它就像一个固定大小的线程池。它还以最有效的方式处理工作项(工作负载会自动平衡,因为线程仅在完成前一项时才会请求新项)。
在伪代码中,这将类似于以下内容。主线只是简单地将工作项添加到队列中。一旦它完成了所有工作,它可以为每个线程发布一个特殊的完成工作项,然后等待它们全部完成。
def queue workqueue = empty
def main:
# start the threads
create threadId[5]
for each threadId (i):
threadId[i] = startThread (worker)
# main work loop, finished with (for example) external signal.
while not finished:
get workitem from some source
add workitem to workqueue
# Place one special FINISH work item for each thread.
for each threadId (i):
add FINISH item to workqueue
# Wait for all threads to exit, then exit main.
for each threadId (i):
wait for threadId[i] to exit
exit
工作线程同样简单。根据需要获取工作项并处理它们的无限循环。
如果工作项是完成工作项,则退出,保证每个线程获得一个且只有一个完成工作项:
def worker:
# Simple infinite loop to get work items.
while true:
get workitem from workqueue
# Exit if told to.
if workitem is a FINISH item:
break
# Otherwise, process the item and loop around to request next.
process workitem
exit