13

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

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

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

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

谢谢

4

4 回答 4

14

查看 Java SE 提供的java.util.concurrentAPI。您可以使用创建线程池,Executors#newFixedThreadPool()并且可以使用这些ExecutorService方法提交任务。无需重新发明自己的线程池。另请参阅有关该主题的 Sun 教程

于 2010-06-06T17:15:08.510 回答
3

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

于 2010-06-06T17:15:19.400 回答
1

看看使用 CyclicBarrier 同步:http: //java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html

于 2010-06-06T21:58:52.177 回答
0

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

于 2010-06-06T21:56:46.020 回答