2010-05-04 103 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(); 
}