我想從生成的子接口回調切換回現有的線程。有誰知道如何?回調實現總是從調用它的子線程運行,而不是實現類...Java - 在現有的線程上運行一個可運行的?
回答
你是什麼意思切換回來?
導致上下文切換,它將使您返回到產生子線程的「原始」線程?
如果是這樣,這是不可能的。它與多線程概念相矛盾。
如果您想在「原始」線程上完成某些工作,而「子」線程正在運行,
您可以考慮在子線程和原始線程之間有一個隊列(即 - 生產者/使用者)。
子線程將在隊列中放置一個「作業」,並且「原始」線程將使用它。
但是,「原始」線程將不得不阻止「子」線程。
實現此目的的另一種方法是使用wait和notify(子線程會通知) - 但是再一次,原始線程將不得不等待。
如果你想在子線程執行結束時返回原始線程,最後的方法是簡單地等待子線程執行結束。 問題是 - 在原始線程中等待在您的方案中是否可以接受?
我喜歡排隊的想法,因爲這會讓父母決定如何處理來自孩子的請求。 1+。 – 2012-07-30 00:35:58
您只需在對象上調用線程wait()
,並讓子線程notify()
爲同一對象。
當調用wait()
時,調用線程將停止。
當調用notify()
時,等待的線程將喚醒並繼續。
這些調用必須在塊/方法內完成。
現在通常不鼓勵使用wait()和notify()來支持更高層次的結構,比如'Semaphore'和'CountDownLatch'。 – Muel 2012-07-30 04:50:20
Swing使用事件分派循環(EDL)的概念,並且所有Swing組件交互必須在EDL的線程上運行。這聽起來類似於你想要做什麼,並且在他的迴應中提出了什麼。
您可能會發現下面有幫助制定解決方案:
SwingUtilities
,在particulare它invokeLater(Runnable)
方法。SwingWorker
如果你想花哨,並開始更多的線程。
由於這也被標記爲java-ee
我會提及您不允許在任何Java EE應用程序服務器中啓動線程。它引入了幾個問題:
- 易出血線程資源的服務器
- 可以防止應用程序
- 可以防止服務器關閉取消部署,如果線程不被標記爲守護進程
- 損失的功能,如JNDI,交易,安全
這通常是一個禁忌。您可以改爲查看@Asynchronous
註釋,它允許您在容器的協作下安全地輕鬆地執行fork/join類邏輯。
這個答案對如何@Asynchronous
方法工作,包括示例代碼https://stackoverflow.com/a/6158773/190816
- 1. 在一個CPU上運行Java線程
- 2. Java的線程池和可運行在創建可運行
- 3. 同時運行在同一個JVM上運行的java程序?
- 4. 運行在一個線程
- 5. Java線程運行
- 6. Java JFrame卡在運行線程上
- 7. Java線程可運行/可調用
- 8. 我可以在java中的線程中運行線程嗎?
- 9. 在java中運行多少個線程?
- 10. 在Java中運行多個線程
- 11. 在線程上運行NSTimer
- 12. 線程是否可運行?或上課?如何在後臺運行線程?
- 13. 如何實現只有一個線程運行的幾個「線程」
- 14. 從另一個線程運行線程
- 15. Java線程。可運行接口
- 16. Java線程擴展可運行狀態
- 17. Java線程:正在運行的JVM
- 18. 在java中的後臺運行線程
- 19. Java線程未運行
- 20. Java線程/運行停止
- 21. IComman/DelegateCommand在哪個線程上運行
- 22. 在solaris上運行一個可執行的C++程序
- 23. 隊列可運行在其他線程運行的Android
- 24. 在UI線程中運行的服務中是否可運行
- 25. Java一次運行一個線程時,它應該一起運行它們
- 26. 線程可運行vs擴展線程
- 27. 使用可運行線程序列化一個類。 Java/Wicket
- 28. iframe是否與所有者在同一個線程上運行?
- 29. 在方法的一個實例上運行的線程
- 30. 在另一個線程中運行MBProgressHUD?
你能提供一些更多的信息非常完整的解釋呢?正確的答案取決於你的類是如何實現的,以及你的應用程序中的線程是如何被分派的。 – 2012-07-30 00:09:30