如何在Java中重复使用线程?

13

我正在构建一个控制台数独求解器,主要目标是提高速度。

现在我有一个ManagerThread,它启动WorkerThreads来计算每个单元格的邻居。因此,当前为每个单元格启动了一个WorkerThread。如何重用已完成工作的现有线程?

线程池模式似乎是解决方案,但我不知道该如何防止线程在完成任务后死亡。

ps:我并不指望在这个特定任务中获得很大的性能提升,只是想尝试一下多线程是如何工作的,然后将其应用于代码更复杂的部分。

谢谢


1
更多关于它如何工作的调查:https://dev59.com/VHE95IYBdhLWcg3wadKq -stackoverflow - Eddy
4个回答

14

2
@David:请记住,对于纯计算任务而言,线程数超过可用核心数会减慢代码运行速度,而不是加快。当然,如果有线程在I/O上阻塞等待,则情况会有所改变。 - T.J. Crowder
4
@T.J. 的观点很中肯。@David,请查看 Runtime#availableProcessors() - BalusC
@BalusC:谢谢,看起来就是我需要的。@TJ:真的吗?使用高优先级值创建多个线程不会从已经运行具有较低优先级的其他进程中拖走更多的CPU资源吗? - David
@David:不用谢。别忘了标记答案为已接受(点击绿色复选标志,也可参见http://stackoverflow.com/faq)。是的,线程数超过可用核心将导致更多的开销来管理它们,这可能会导致总体上变慢。 - BalusC
@BalusC:我刚刚将其标记为已接受... cookie-session 不允许我这样做,但现在已经解决了!;-) - David

3
使用线程池 (java.util.concurrent) 时,您实际上从未初始化过线程 - 而是将 Runnable 传递给线程池。 您无需担心线程的生命周期,只需在 runnable 中完成需要做的工作,并让它在完成后退出即可。


0

如果我不使用OpenSymphony的Quartz包,而是自己编写这个逻辑,我会这样做: 我会创建一个继承Thread的WorkerThread类。这个类还将拥有一个名为runnable的私有属性,它是Runnable类型的。这个属性将保存对你想要执行的代码的引用。为它提供一个公共的setter方法。 主线程代码将从运行初始化时设置的runnable开始,并切换到等待状态。在这之前,它将向池管理器标记已完成并可以返回到池中。下次需要线程时,从池中选择一个线程,调用setRunnable方法设置属性runnable,然后唤醒线程。它将重新开始工作,进入无限循环:执行runnable并返回等待状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接