Can';不要让java使用多个核心

Can';不要让java使用多个核心,java,concurrency,profiling,Java,Concurrency,Profiling,我正在处理一个并发分配,它涉及并行化一个性能问题。这个问题涉及大量的阻塞i/o,因此对于我的报告,我想使用并比较各种方法的cpu使用情况 我对评测还不熟悉,我从Java的虚拟虚拟机开始,但即使有多个线程在没有阻塞的情况下运行紧密循环,我似乎也无法获得超过50%的cpu使用率。这似乎是我的两个内核中只有一个被使用 如何让线程同时使用两个内核?我尝试过手动创建线程和使用executor框架 提前感谢我不知道你的代码在做什么,但这使我所有的核心都达到了100% import java.util.con

我正在处理一个并发分配,它涉及并行化一个性能问题。这个问题涉及大量的阻塞i/o,因此对于我的报告,我想使用并比较各种方法的cpu使用情况

我对评测还不熟悉,我从Java的虚拟虚拟机开始,但即使有多个线程在没有阻塞的情况下运行紧密循环,我似乎也无法获得超过50%的cpu使用率。这似乎是我的两个内核中只有一个被使用

如何让线程同时使用两个内核?我尝试过手动创建线程和使用executor框架


提前感谢

我不知道你的代码在做什么,但这使我所有的核心都达到了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++;
        }
    }
}
import java.util.concurrent.*;
公共类测试实现可运行{
公共静态void main(字符串[]args)引发InterruptedException{
测试任务=新测试();
int threads=Runtime.getRuntime().availableProcessors();
ExecutorService池=Executors.newFixedThreadPool(线程);
对于(int i=0;i
int processors=Runtime.getRuntime().availableProcessors();
对于(int i=0;i<处理器;i++){
Thread yourThread=new athrreadyoucreated();
//您可能需要传入参数,这取决于您正在做的工作以及如何设置线程。
yourThread.start();
}

这样你就能解决你的问题了

你的代码有问题。不幸的是,您没有发布任何代码,因此很难看到问题所在。请给出一个简短但完整的例子来说明这个问题……CPU的总使用量由操作系统控制,而不是由JVM直接控制,因此,操作系统可能允许JVM使用50%的CPU,在这个范围内,线程是高效的(在并发使用中)-你能看到可视化虚拟机显示2个线程在运行,每个线程都有这么多CPU%?也许你确实使用了内核,但除了一个线程外,所有线程都在等待IO操作?*//我有4个内核,超线程…*这将是一个更好的常量
Runtime.getRuntime().availableProcessors()
:),如果进程没有所有CPU关联,则会小心处理。@bestsssL将修复,谢谢。这是一个又快又脏的黑客:)现在我们知道你使用的是基于intel 1socket cpu的计算机机箱。@bestsss:你可以在我的博客上找到更多关于我使用的机器的信息:)非常感谢,我以后会记得发代码的。我实际上是在代码中使用System.out.println()阻塞的,doh。。。
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();
}