我正嘗試使用多線程,實際上是一個線程池,用於一大組併發任務。不幸的是,線程所需要使用的工具也是通過使用線程來實現的,它由第三方提供。使用線程內部線程安全嗎?什麼應該考慮或應該完全避免。在Java中的線程內調用線程時應該考慮什麼?它應該被避免嗎?
回答
在線內使用線程安全嗎?
如果庫是線程安全的,您應該可以從多個線程使用它。
應該考慮什麼或應該完全避免。
如上所述,你應該確保所有參與類(庫類,和你的類)是線程安全的。
我個人試圖完全避免幾個線程,至少使用或作爲高級構造,例如使用java.util.concurrent
包中的類。
你可能想在
- The Java™ Tutorials: Thread Pools閱讀起來,
- 的
ExecutorService
的各種實現。
所有線程都用在其他線程的「內部」。 (除了你開始的那個)
也許你可以更詳細地解釋你的疑問。
謝謝,彼得。更多細節在這裏: –
謝謝,彼得。更多細節在這裏:我在爲網絡發現做泛洪ping,icmp ping包是使用線程實現的,我試圖實現的併發ping會使用線程池,例如Quartz包。這樣做是否安全?從測試中,icmp ping一段時間剛剛被阻塞,並且內存消耗非常迅速。 –
我不明白爲什麼從Quartz線程開始,它不會有正常的問題(它可以工作,也可以不用)。如果你的線程池沒有限制,你可能會遇到資源問題。解決這個問題的唯一方法就是正確配置庫或修復代碼。用ping來淹沒網絡可能不是那麼有用。也許你可以使用廣播ping。 –
我認爲沒有這樣的概念'線內線程' 所有的線程都被某個線程或另一個線程調用。 (除了少數明顯的) 所以他們都有點平行。
感謝您的澄清。我現在得到一些想法 –
應該考慮什麼或應該完全避免。
幾件事情需要考慮:
- 線程是資源餓了。
- 創建線程很昂貴。
- 線程池改善了線程創建的成本,但是在某些情況下,有界線程池會導致致命的問題。
- 線程不利於解決分而治之的問題,除非你的算法明智地使用線程。 (不要使用/浪費線程,你應該使用遞歸。)
我說的致命問題是線程遞歸fork其他線程並等待它們完成。如果使用無界線程池,則最終可能會有不合理數量的線程。如果使用有界的線程池,則可能會以死鎖的形式結束,所有線程都在使用中,並且(可能)所有線程都被阻塞,等待創建更多線程。
(這聽起來像你的情況下有這種可能性。)
感謝Stephen的建議。你提到的潛在問題實際上發生在我身上,可能是僵局。我會盡力確認它。 –
- 1. unSubscribeOn調用了什麼線程?我們應該叫它嗎?
- 2. 我應該考慮以下代碼作爲線程安全嗎?
- 3. 如何避免在主線程中同時調用該方法?
- 4. 在創建用於torrent的asp.net應用程序時,我應該考慮什麼?
- 5. C++程序員應該避免memset嗎?
- 6. 應該在主線程之外的線程中調用URLForUbiquityContainerIdentifier:
- 7. 我應該在生產應用程序中避免打包嗎?
- 8. 我應該在迴應請求時避免調用require嗎?
- 9. 線程池,多線程,異步等。我應該使用什麼?
- 10. 我應該在EDT中創建的線程中調用InvokeLater嗎?
- 11. 部署iPads應該考慮什麼?
- 12. 選擇SQL/NoSQL應該考慮什麼?
- 13. 我應該在UI線程中調用`Service`的函數嗎?
- 14. 編寫一個應該永遠運行的java程序時要考慮什麼
- 15. 應該在UI線程中調用findviewbyid嗎?
- 16. ClassLoader應該是線程安全的嗎?
- 17. 線程應該是靜態的嗎?
- 18. 類應該是線程安全的嗎?
- 19. 遠程服務緩存策略;我應該考慮什麼?
- 20. 你應該在Java中創建無限數量的線程嗎?
- 21. 爲什麼我應該避免在應用程序代碼中使用ClassType?
- 22. python中應該怎麼產生線程
- 23. 這條線應該是什麼? (java)
- 24. 我應該避免UI時,iOS應用程序在後臺
- 25. 什麼時候應該使用UdpClient.BeginReceive?什麼時候應該在後臺線程上使用UdpClient.Receive?
- 26. 什麼時候應該避免在Clojure中使用`seq`?
- 27. 如何避免應用程序可以做它的主線程
- 28. 當它不應該是線程塊
- 29. 應該釋放線程對象嗎? C#
- 30. Java:我應該在這種情況下使用多線程嗎?
線程不會運行在其他線程的「內部」。線程運行**並行**到其他線程,**在一個公共(父級)進程內部。**事實上,從根本上講,您看起來並不瞭解線程是什麼,這表明您應該避免使用它們學習基礎知識。 –
謝謝你們,請在下面的回答中看到更多的細節 –