我有一個場景,我必須同時調用多個對象,並且每個對象都會在內部調用多個其他類的對象。執行完所有子對象後,它應該將結果返回給父對象,最後,父對象將返回結果返回給主線程。它基本上是兩級多線程。在實施這種情況時,我不知道我應該考慮什麼。我真的很感謝任何和所有的指導,最好用一些示例代碼。多層次(多級)多線程
我附上了一張清楚瞭解情景的照片。
simplty我需要creatre一組線程,每個創建的線程創建另一個線程集。並且還需要隨時控制每個線程。希望它再次清楚地表示感謝
我有一個場景,我必須同時調用多個對象,並且每個對象都會在內部調用多個其他類的對象。執行完所有子對象後,它應該將結果返回給父對象,最後,父對象將返回結果返回給主線程。它基本上是兩級多線程。在實施這種情況時,我不知道我應該考慮什麼。我真的很感謝任何和所有的指導,最好用一些示例代碼。多層次(多級)多線程
我附上了一張清楚瞭解情景的照片。
simplty我需要creatre一組線程,每個創建的線程創建另一個線程集。並且還需要隨時控制每個線程。希望它再次清楚地表示感謝
據我所知:每個家長都會產生一定數量的孩子,必須等待所有孩子(以及孩子的孩子等)才能完成?
在這種情況下,每個父母可以爲每個孩子產生一個線程,然後使用semaphore等待所有這些線程完成。信號量允許您一次等待多個線程。
編輯:你提到了四個任務。
ADD線程:創建一個新線程,管理其父項列表中的所有線程。使用同步來維護該列表,因爲如果不能保證只有一個線程會觸及此列表。
PAUSE:設置PAUSED標誌。這將導致線程sleep()
或wait()
。
恢復:取消設置PAUSED標誌。如果暫停使線程wait()
,請致電notify()
將其喚醒。
刪除:設置STOPPED標誌,然後從列表中刪除,或等到線程完成從列表中刪除(取決於你需要什麼)之前完成。如果線程可能被暫停,請確保首先恢復。
運行循環的線程必須使用這些標誌來確定:是否暫停和是否退出循環,從而停止線程。類似這樣的:
while (!isStopped)
{
while (hasWork() && !isPaused && !isStopped)
{
// do work
}
if (!isStopped)
{
// either just sleep for a few milliseconds (easy way) or wait()
}
}
確保你不會產生太多的線程。如果您已經產生了多於x
線程,那麼您應該讓孩子等待而不是創建更多線程,其中x
取決於您的操作系統和JVM。玩它。直覺可能會告訴你:線程越多越好,但這絕對是錯誤的。一旦你超過了一定數量的線程,他們已經在使用你所有計算機的可用資源(如CPU,內存帶寬和硬盤帶寬)。產生比使用所有資源所需的線程更多的線程只會增加管理開銷並降低執行速度。
在現代系統中,競爭的線程調度可能會做得很好,但每個線程仍然有它的價格標籤。想象一下,所有的線程都想同時訪問CPU,內存等。這會產生爭用,需要一個非常智能的調度程序(足夠聰明地預測未來,誰能做到這一點?),不會造成任何明顯的開銷。
好運。
您可以在主對象上創建N個父線程,並且在每個線程對象上調用開始之後,您可以調用每個對象的連接。主對象將阻止第一個等待它完成,一旦它完成,它將嘗試加入第二個,第三個等等,直到第N個,但它們可能已經完成,然後主要將是能完成。
在父母和子女之間的關係中使用相同的方法。然而,從您的問題中不清楚子線程必須做什麼,您可能需要根據當前的任務提供一些併發控制。
乾杯。
ForkJoinPool和RecursiveTask是專爲這種使用情況。見fork-join tag
你似乎並不具備居然問一個問題。 – DaoWen
大家好..我需要創建一些線程和每個創建的線程將不得不創建一組另一個線程。並且還需要隨時控制每個線程。希望一切都清楚, – Jobz
您還沒有問過任何問題。你所做的只是給你的項目提出一些要求。這聽起來更像是你要求某人爲你設計它。也就是說,我會查看Alexei Kaigorodov關於fork/join線程池的答案。 – DaoWen