2014-11-08 38 views
1

我的應用程序應該具有「實時暫停」功能。用戶可以暫停執行,做一些修改將要發生的事情,然後解除暫停並讓事情發生。東西按用戶指定的時間間隔發生,速度可以很慢,可以很快。線程是否有助於提高Java的效率?

我在這裏使用線程的目標是提高多核系統的性能。應用程序應該在時間間隔內緊縮的數據量應該是任意大的(我期望在集合上有很多和很多的循環,修改對象屬性和生成隨機數,但是珍貴的小磁盤訪問)。我不希望應用程序受到單個內核容量的限制,如果它可以使用更多的內存來加快運行速度。

這實際上是這樣工作嗎?我已經運行了一些測試(在程序活動期間對程序進行了大量計算,並查看了CPU的使用情況),但這並不是確鑿的結果 - 在我的雙核心機器上,使用率肯定接近100%但幾乎沒有100%。單線程(僅主要)Java應用程序是否使用所有可用的核心進行計算?

+0

「我在這裏使用線程的目標是提高多核系統的性能。」 < - 嗯,這可能會提高性能,是的,但是在並行處理時對性能更好的影響最大的因素是處理數據的算法 – fge 2014-11-08 09:11:32

+0

當然,單線程應用程序並不使用所有內核。 – kraskevich 2014-11-08 09:13:47

回答

2

單線程(僅主要)Java應用程序是否使用所有可用的核心進行計算?

不,它通常會使用單個內核。

讓一個程序與多個線程並行執行計算可能會使其運行速度更快,但它對於任何類型的問題都不是一個神奇的解決方案。對於你的程序來說,這是否是一個合適的解決方案取決於你的程序在做什麼,以及算法是否可以並行化。例如,如果您正在進行大量的計算,其中下一次計算取決於前一次計算的結果,那麼使其成爲多線程將無濟於事,因爲您無法同時進行計算 - 下一個首先必須等待前一個的答案。所以,你首先必須考慮你的程序中的哪些計算可以並行運行。

Java對多線程有很多支持。您可以直接使用線程編程,或使用executor service或使用fork/join framework。什麼是合適的取決於你想要做什麼。

+0

很好地解釋了 – 2014-11-08 09:29:40

+0

好吧,所以假設我有一些需要以某種方式處理的元素集合,但是不需要訪問同一集合中的其他元素,那麼使用線程將會對此有所幫助?我需要點燃線程,然後等待所有線程完成。您提到的那種線程的哪種類型在這裏最合適? – 2014-11-08 09:49:26

+0

如果您使用的是Java 8,那麼平行流(Steve Siebert提到的)可能是最簡單的,否則是執行器服務。如果您必須將所有計算的結果合併爲一個最終結果,則fork/join將非常有用。 – Jesper 2014-11-08 10:36:10

1

一個java線程將運行在一個CPU上。要使用多個CPU,你應該有多個線程。

2

單線程(僅主要)Java應用程序是否使用所有可用的內核進行計算?

通常不會,但你可以利用一些Java中的較高級別的API,實際上是使用線程爲你和你不會甚至直接usinfpg線程,多obviousiously叉/加入和執行者,不太明顯的新的流API集合(即parallelStream)。

但是,一般來說,要利用所有內核,您需要進行某種併發。更進一步......真的很難只觀察你的操作系統監視器來看看發生了什麼(特別是只有2個內核)......你的操作系統還有其他的事情正在發生(試圖管理自己,運行你的IDE,運行crontab,運行一個瀏覽器發佈到stackoverflow;)。

最後,只是實現(併發)本身可能沒有幫助,你必須爲你的代碼/算法「正確」。

1

想象一下,你必須用手執行各種任務。你會用一隻手慢慢做,並且更有效地使用雙手。同樣,在Java或其他語言中,多線程爲系統提供了許多手段。好消息是你可以有很多線程來完成不同的任務。在單個線程中運行操作會使程序不穩定,有時甚至無法響應。一個好的做法是在一個單獨的線程中執行長時間運行的任務。例如,從一個數據庫加載大塊數據應該在一個單獨的線程中處理。從互聯網上下載數據也應該在一個單獨的線程中處理。如果您在主線程中執行長時間運行操作,會發生什麼情況?程序HANGS,並將變得沒有響應,直到任務完成,用戶會認爲有些錯誤。我希望你得到它