Java 递归创建线程时跟踪线程

Java 递归创建线程时跟踪线程,java,multithreading,concurrency,graph,Java,Multithreading,Concurrency,Graph,我目前正在为一门课程编写一些代码。我不能发布代码,但我被允许谈论一些我正在努力解决的高级概念,并接受它们的输入。基本上,代码是一个无向图上的递归DFS,我应该将其转换为并发程序。我的教授已经指定我应该在递归DFS方法中创建线程,然后在另一个方法中加入它们。基本上,我在思考如何跟踪我正在创建的线程时遇到了困难,这样我就可以用另一种方法连接所有线程。我正在考虑一个线程数组,但我不确定如何将每个新线程添加到数组中,或者即使这是正确的方向 听起来不错,您需要一个线程列表。由于您将从多个线程访问列表/数组

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

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

您可以在主应用程序线程中创建一个新的ThreadGroup对象,然后使所有生成的线程成为它的成员。当您试图取回ThreadGroup上的enumerate方法时,您只需对其奇怪的语义保持警惕。(仔细阅读javadoc!)


加入他们的目的是什么?只是为了看看他们是否完成了?也许学习如何在Java中使用接口实现委托模式会有所帮助。

实现这一点的另一种方法是使用
阻塞队列
线程池执行器
。 您可以继续向
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();
}
私有线程池执行器池;
私有阻塞队列;
...
this.pool=新ThreadPoolExecutor(10,10,新长(1000),
TimeUnit.millizes,this.queue);
...
//创建并添加到队列的新线程
请求的任务++
if(requestedTasks==this.pool.getCompletedTaskCount()&&this.queue.isEmpty()){
this.pool.shutdown();
}

谢谢。所以像ArrayBlockingQueue这样的东西可能是个好主意?我不认为我的列表是线程安全的。BlockingQueue是一种线程安全的方式来传递信息。您的列表是否在迭代过程中更改?如果没有,那么您就不需要担心如何分配工作的线程安全性。线程安全是指线程正在运行的线程。因此,在所有线程返回之前,我不会打印生成树。啊,我想需要更多关于线程如何聚合其结果的信息,以提供更智能的建议。如果从主应用程序线程连接它们是为分配指定的方法,那么仔细考虑它没有任何好处!我认为这是最优雅的解决方案。然后我将循环while(activecount>0)加入他们。谢谢