2012-07-29 68 views
1

我想從生成的子接口回調切換回現有的線程。有誰知道如何?回調實現總是從調用它的子線程運行,而不是實現類...Java - 在現有的線程上運行一個可運行的?

+1

你能提供一些更多的信息非常完整的解釋呢?正確的答案取決於你的類是如何實現的,以及你的應用程序中的線程是如何被分派的。 – 2012-07-30 00:09:30

回答

5

你是什麼意思切換回來?
導致上下文切換,它將使您返回到產生子線程的「原始」線程?
如果是這樣,這是不可能的。它與多線程概念相矛盾。
如果您想在「原始」線程上完成某些工作,而「子」線程正在運行,
您可以考慮在子線程和原始線程之間有一個隊列(即 - 生產者/使用者)。
子線程將在隊列中放置一個「作業」,並且「原始」線程將使用它。
但是,「原始」線程將不得不阻止「子」線程。

實現此目的的另一種方法是使用wait和notify(子線程會通知) - 但是再一次,原始線程將不得不等待。

如果你想在子線程執行結束時返回原始線程,最後的方法是簡單地等待子線程執行結束。 問題是 - 在原始線程中等待在您的方案中是否可以接受?

+0

我喜歡排隊的想法,因爲這會讓父母決定如何處理來自孩子的請求。 1+。 – 2012-07-30 00:35:58

2

您只需在對象上調用線程wait(),並讓子線程notify()爲同一對象。

當調用wait()時,調用線程將停止。
當調用notify()時,等待的線程將喚醒並繼續。

這些調用必須在​​塊/方法內完成。

+0

現在通常不鼓勵使用wait()和notify()來支持更高層次的結構,比如'Semaphore'和'CountDownLatch'。 – Muel 2012-07-30 04:50:20

0

Swing使用事件分派循環(EDL)的概念,並且所有Swing組件交互必須在EDL的線程上運行。這聽起來類似於你想要做什麼,並且在他的迴應中提出了什麼。

您可能會發現下面有幫助制定解決方案:

0

由於這也被標記爲java-ee我會提及您不允許在任何Java EE應用程序服務器中啓動線程。它引入了幾個問題:

  • 易出血線程資源的服務器
  • 可以防止應用程序
  • 可以防止服務器關閉取消部署,如果線程不被標記爲守護進程
  • 損失的功能,如JNDI,交易,安全

這通常是一個禁忌。您可以改爲查看@Asynchronous註釋,它允許您在容器的協作下安全地輕鬆地執行fork/join類邏輯。

這個答案對如何@Asynchronous方法工作,包括示例代碼https://stackoverflow.com/a/6158773/190816