2011-10-07 62 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

只有当你运行的任务永远不会被阻塞时才会起作用。 –