2017-08-26 40 views
2

我一直有一些麻煩找到點,在我的代碼可以改善更好的並行性。我有一個相當繁重的任務,我用ExecutorService執行多次。但是,通過修改它的參數使它變得更重一些,我發現有一個問題,我的任務都在等待其中一個完成,而我期望每個任務都獨立於另一個任務。如何分析哪些方法/資源在Java中擁有Thread?

我想知道是否有任何方法可以分析我的代碼以找到線程正在等待某些資源的點,以便我知道應該在哪裏修改以提高程序的並行性能。程序相對較大,因此分析每個控制流程本身需要很長的時間(同時也容易出錯),我寧願以編程方式進行。

謝謝你的時間。

+0

您的任務是否使用(可能)並行流處理? – Bohemian

+0

除非'Collections#stream()'有一些意外的行爲,我確定沒有任何Stream#parallel()調用我的任務,但是由於代碼庫足夠大,我不知道每個細節它有一個編程方法來找出代碼可能掛起的點,可能會有所幫助 – Badashi

回答

1

最簡單的方法是使用jstack獲取很少的線程轉儲,並查看大部分線程在哪裏。如果這還不夠,運行一個探查器,再簡單一點可能就是Visual VM CPU採樣器,它會告訴你每個線程在哪裏花費時間,包括等待。這應該涵蓋最常見的情況。

相關問題