2010-05-04 79 views
2

我目前正在研究某个课程的某些代码。我不能发布代码,但我可以谈论一些我正在努力的高级概念并接受他们的输入。基本上,代码是一个无向图上的递归DFS,我应该将其转换为并发程序。我的教授已经指定我应该在递归DFS方法中创建我的线程,然后以另一种方法加入它们。基本上,我在思考如何跟踪我创建的线程时遇到问题,因此我可以用其他方法加入所有线程。我正在考虑一系列线程,但我不确定如何将每个新线程添加到数组,或者即使这是正确的方向。递归创建时跟踪线程

回答

0

听起来不错,你会想要一个线程列表。由于您将从多个线程访问列表/数组,因此您可以使用其中一个线程安全列表类,或者拥有一个同步的“addThread(Thread newlyCreatedThread)”方法。希望这可以帮助!

+0

谢谢。所以像ArrayBlockingQueue可能是一个好主意?我没有想到我的列表是线程安全的。 – 66replica 2010-05-04 23:43:56

+0

BlockingQueue是传递信息的线程安全方式。你的清单是否在中期迭代?如果没有,那么你不需要担心你如何分配工作的线程安全。线程正在运行的线程安全,是的。 – bwawok 2010-05-05 02:08:23

0

您可以在主应用程序线程中创建一个新的ThreadGroup对象,然后让它的所有派生线程成员。当你尝试让ThreadGroup返回时,你只需要警惕ThreadGroup枚举方法的古怪语义。 (仔细阅读javadoc!)

无论如何加入他们的目的是什么?只是为了了解他们是否完成了?也许学习如何通过接口来实现Java中的委托模式会很有帮助。

+0

因此,在我假设所有线程都返回之前,我不打印生成树。 – 66replica 2010-05-04 23:47:16

+0

啊,我想知道更多关于这些线程如何汇总他们的结果的信息,以提供更聪明的建议。如果从主应用程序线程中加入它们是为分配指定的方法,那么没有过度考虑它的优点! – Affe 2010-05-05 00:41:41

+0

我认为这是最优雅的解决方案。然后我会循环(activecount> 0)加入它们。谢谢。 – 66replica 2010-05-05 00:48:29

2

实现此目的的另一种方法是使用BlockingQueueThreadPoolExecutor。 您可以不断地将新线程添加到BlockingQueue,保持计数您添加的人数,然后在完成后关闭ThreadPoolExecutor

private ThreadPoolExecutor pool; 
private BlockingQueue<Runnable> queue; 
... 
this.pool = new ThreadPoolExecutor(10, 10, new Long(1000), 
       TimeUnit.MILLISECONDS, this.queue); 
... 

//new thread created and added to the queue 
requestedTasks++ 

if (requestedTasks == this.pool.getCompletedTaskCount() && this.queue.isEmpty()) { 
    this.pool.shutdown(); 
}