2011-10-07 33 views
2

我正在研究一個併發分配問題,它涉及並行處理性能問題。這個問題涉及到相當數量的阻塞I/O,所以對於我想要使用的報告並比較各種方法的CPU使用情況。無法讓java使用多個核心

我是新來分析,我已經開始使用Java的虛擬虛擬機,但即使多線程運行一個沒有阻塞的緊密循環,我似乎無法獲得50%以上的CPU CPU。這似乎是我的兩個核心中只有一個正在使用。

如何讓我的線程使用兩個內核?我已經嘗試了手動創建線程和使用executor框架。

在此先感謝

+5

您的代碼存在問題。不幸的是,你還沒有發佈任何代碼,這使得很難看到問題出在哪裏。請發佈一個簡短但完整的示例來演示該問題...... –

+0

總CPU使用率由操作系統控制 - 不直接由JVM控制 - 因此可能操作系統允許JVM使用CPU的50%,其中您的線程效率很高(在併發使用中) - 你能看到Visual VM顯示兩個線程每個CPU運行多少CPU嗎? – Bhaskar

+0

也許你確實在使用核心,但除了一個之外的所有線程實際上都在等待IO操作? – bestsss

回答

4

我不知道你的代碼是幹什麼的,但這種設法把我所有的內核高達100%......

import java.util.concurrent.*; 

public class Test implements Runnable { 

    public static void main(String[] args) throws InterruptedException { 
     Test task = new Test(); 
     int threads = Runtime.getRuntime().availableProcessors(); 
     ExecutorService pool = Executors.newFixedThreadPool(threads); 
     for (int i = 0; i < threads; i++) { 
      pool.submit(task); 
     } 
     pool.awaitTermination(120, TimeUnit.SECONDS); 
    } 

    @Override public void run() { 
     System.out.println("Task running..."); 
     int i = 0; 
     while (true) { 
      i++; 
     } 
    } 
} 
+0

* //我有4個內核,超線程... *這將是一個更好的常量'Runtime.getRuntime()。availableProcessors()':),並注意如果進程並非所有的CPU親和力。 – bestsss

+0

@bestsssL將解決,謝謝。這是一個快速和骯髒的破解:) –

+1

現在我們知道你使用的是基於intel 1socket cpu的計算機盒。 – bestsss

0
int processors = Runtime.getRuntime().availableProcessors(); 
for(int i=0; i < processors; i++) { 
    Thread yourThread = new AThreadYouCreated(); 
    // You may need to pass in parameters depending on what work you are doing and how you   setup your thread. 
    yourThread.start(); 
} 

這樣你可以解決你的問題!

+0

只有當你運行的任務永遠不會被阻塞時纔會起作用。 –