簡體   English   中英

如何檢查Java程序中的線程是順序運行還是並行運行?

[英]How to check whether threads in Java program are running sequentially or parallel?

我有一個Java程序,它將一些文件提取到客戶端計算機上。 我已經實現了4個線程來提取文件。 但是線程實現幾乎不會影響提取時間。 我已經在jvisualvm中檢查了線程執行情況,它看起來還不錯,並且我確定線程是通過並行方式實現的。 這是我的系統配置...

Windows XP,Core2duo,3GB RAM。 java-vm-args:-Xmx512M -Xss2M。 我已將可用的處理器打印到正在運行的JVM ... Runtime.getRuntime()。availableProcessors()= 1(如果我沒記錯,它應該執行2個邏輯線程)。

我想念什么嗎? 我們如何確保線程在硬件級別並行運行?

我們如何確保線程在硬件級別並行運行?

我認為這主要是一個無效的問題。 在Linux下,您可以使用ps -eLfl查看線程及其狀態,但在其他OS上則無法使用。 線程轉儲將顯示線程狀態。 通過jconsole中的“線程”選項卡並單擊線程也將顯示其狀態。

但是線程實現幾乎不影響提取時間

正如其他人所提到的,這是一個教科書標志,表明您的程序受IO約束。 您的所有線程都在爭用相同的IO資源,並且大部分時間都花在等待隊列中。

為了檢驗該理論,請將您的應用程序移至更快的磁盤系統。 SSD是這里的炸彈。 首先將文件加載到內存中,然后使用不同數量的線程運行處理也可以隔離IO帶寬問題。 也將使用內存文件系統。

如果您的進程受IO限制,那么在不增加IO帶寬的情況下可能沒有任何方法可以加快它的速度。

當CPU成為瓶頸時,並行執行會有所幫助。 在您的情況下,瓶頸可能是I / O,而不是CPU。 另外,您具有1個具有超線程的物理核心。 在這種情況下,即使CPU處於瓶頸,並行執行也可能無濟於事。 而且,在某些情況下,單核,超線程CPU上的雙線程應用程序可能比單線程應用程序慢。 超線程主要是營銷技巧。 不要依賴它。

您缺少的是提取時間不僅包括CPU時間,還包括HDD讀寫。 與CPU執行的ZIP算法相比,這兩個時間要花幾個數量級。

我認為除了通過外部手段之外,沒有其他方法可以檢查這一點。 例如

  • 查看Windows Task Manager性能圖,或
  • 將VisualVM附加到JVM。

我已經將可用的處理器打印到正在運行的JVM:

  Runtime.getRuntime().availableProcessors() = 1

這意味着您認為JVM認為它只有1個處理器可用。 如果您實際上有兩個物理核心(或HT虛擬核心),則操作系統僅允許JVM使用它們之一。

(您的代碼中的某種瓶頸不會導致availableProcessors()返回1


我們如何確保線程在硬件級別並行運行?

您需要確保操作系統允許 JVM使用多個內核。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM