如何在Java中重用一个线程?

时间:2010-06-06 17:10:59

标签: java multithreading performance threadpool sudoku

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

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

线程池模式似乎是解决方案,但我不明白如何防止线程在其作业完成后死亡。

ps:我不希望这个特定任务获得太多性能,只是想在将多线程应用到更复杂的代码部分之前尝试多线程的工作原理。

由于

4 个答案:

答案 0 :(得分:14)

查看Java SE提供的java.util.concurrent API。您可以使用Executors#newFixedThreadPool()创建线程池,并且可以使用ExecutorService方法提交任务。无需重新发明自己的线程池。另请参阅Sun tutorial on the subject

答案 1 :(得分:3)

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

答案 2 :(得分:1)

答案 3 :(得分:0)

好吧,如果我不得不将这个逻辑编码为我自己,而不是使用OpenSymphony中的Quartz这样的包,我会做以下事情: 我有一个扩展Thread的WorkerThread。这个类还有一个名为runnable的私有属性,它是Runnable。此属性将包含对您要执行的代码的引用。有一个公共二传手。 主线程代码将通过运行您初始化它的runnable开始,然后切换到等待状态。在执行此操作之前,它会向池管理器标记它已完成,并且可以将其返回到池中。下次需要一个线程时,从池中选择一个,调用setRunnable设置属性runnable,然后唤醒线程。它会产生回来工作,进入无限循环:执行并运行并返回等待状态。