我正在构建一个控制台数独求解器,主要目标是提高速度。
现在我有一个ManagerThread,它启动WorkerThreads来计算每个单元格的邻居。因此,当前为每个单元格启动了一个WorkerThread。如何重用已完成工作的现有线程?
线程池模式似乎是解决方案,但我不知道该如何防止线程在完成任务后死亡。
ps:我并不指望在这个特定任务中获得很大的性能提升,只是想尝试一下多线程是如何工作的,然后将其应用于代码更复杂的部分。
谢谢
我正在构建一个控制台数独求解器,主要目标是提高速度。
现在我有一个ManagerThread,它启动WorkerThreads来计算每个单元格的邻居。因此,当前为每个单元格启动了一个WorkerThread。如何重用已完成工作的现有线程?
线程池模式似乎是解决方案,但我不知道该如何防止线程在完成任务后死亡。
ps:我并不指望在这个特定任务中获得很大的性能提升,只是想尝试一下多线程是如何工作的,然后将其应用于代码更复杂的部分。
谢谢
请查看Java SE提供的java.util.concurrent
API。您可以使用Executors#newFixedThreadPool()
创建线程池,并使用 ExecutorService
方法提交任务。无需重新发明自己的线程池。另请参阅有关该主题的Sun教程。
建议尝试使用CyclicBarrier同步:http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html
如果我不使用OpenSymphony的Quartz包,而是自己编写这个逻辑,我会这样做: 我会创建一个继承Thread的WorkerThread类。这个类还将拥有一个名为runnable的私有属性,它是Runnable类型的。这个属性将保存对你想要执行的代码的引用。为它提供一个公共的setter方法。 主线程代码将从运行初始化时设置的runnable开始,并切换到等待状态。在这之前,它将向池管理器标记已完成并可以返回到池中。下次需要线程时,从池中选择一个线程,调用setRunnable方法设置属性runnable,然后唤醒线程。它将重新开始工作,进入无限循环:执行runnable并返回等待状态。