2011-11-23 61 views
1

我正嘗試使用多線程,實際上是一個線程池,用於一大組併發任務。不幸的是,線程所需要使用的工具也是通過使用線程來實現的,它由第三方提供。使用線程內部線程安全嗎?什麼應該考慮或應該完全避免。在Java中的線程內調用線程時應該考慮什麼?它應該被避免嗎?

+2

線程不會運行在其他線程的「內部」。線程運行**並行**到其他線程,**在一個公共(父級)進程內部。**事實上,從根本上講,您看起來並不瞭解線程是什麼,這表明您應該避免使用它們學習基礎知識。 –

+0

謝謝你們,請在下面的回答中看到更多的細節 –

回答

1

在線內使用線程安全嗎?

如果庫是線程安全的,您應該可以從多個線程使用它。

應該考慮什麼或應該完全避免。

如上所述,你應該確保所有參與類(庫類,和你的類)是線程安全的。

我個人試圖完全避免幾個線程,至少使用作爲高級構造,例如使用java.util.concurrent包中的類。

你可能想在

1

所有線程都用在其他線程的「內部」。 (除了你開始的那個)

也許你可以更詳細地解釋你的疑問。

+0

謝謝,彼得。更多細節在這裏: –

+0

謝謝,彼得。更多細節在這裏:我在爲網絡發現做泛洪ping,icmp ping包是使用線程實現的,我試圖實現的併發ping會使用線程池,例如Quartz包。這樣做是否安全?從測試中,icmp ping一段時間剛剛被阻塞,並且內存消耗非常迅速。 –

+0

我不明白爲什麼從Quartz線程開始,它不會有正常的問題(它可以工作,也可以不用)。如果你的線程池沒有限制,你可能會遇到資源問題。解決這個問題的唯一方法就是正確配置庫或修復代碼。用ping來淹沒網絡可能不是那麼有用。也許你可以使用廣播ping。 –

0

我認爲沒有這樣的概念'線內線程' 所有的線程都被某個線程或另一個線程調用。 (除了少數明顯的) 所以他們都有點平行。

+0

感謝您的澄清。我現在得到一些想法 –

2

應該考慮什麼或應該完全避免。

幾件事情需要考慮:

  • 線程是資源餓了。
  • 創建線程很昂貴。
  • 線程池改善了線程創建的成本,但是在某些情況下,有界線程池會導致致命的問題。
  • 線程不利於解決分而治之的問題,除非你的算法明智地使用線程。 (不要使用/浪費線程,你應該使用遞歸。)

我說的致命問題是線程遞歸fork其他線程並等待它們完成。如果使用無界線程池,則最終可能會有不合理數量的線程。如果使用有界的線程池,則可能會以死鎖的形式結束,所有線程都在使用中,並且(可能)所有線程都被阻塞,等待創建更多線程。

(這聽起來像你的情況下有這種可能性。)

+0

感謝Stephen的建議。你提到的潛在問題實際上發生在我身上,可能是僵局。我會盡力確認它。 –

相關問題