Java cpu在多线程中未得到充分利用

Java cpu在多线程中未得到充分利用,java,Java,我正在为一个使用并行线程进行计算的推荐引擎编写代码。在运行时,我在8核CPU上获得了265-300%的最大CPU使用率(使用top命令)。我不明白的是,为什么即使在将近50%的CPU空闲时,它也不使用完整的CPU。使用并行性的伪代码部分是: getRecoFromCandidates(){ t=new Thread(new KNN(uid,profile,candidates));// does knn using closest neighbors rec=Recommenda

我正在为一个使用并行线程进行计算的推荐引擎编写代码。在运行时,我在8核CPU上获得了265-300%的最大CPU使用率(使用top命令)。我不明白的是,为什么即使在将近50%的CPU空闲时,它也不使用完整的CPU。使用并行性的伪代码部分是:

getRecoFromCandidates(){
    t=new Thread(new KNN(uid,profile,candidates));// does knn using closest neighbors
    rec=RecommendationsFromSet(NB_RECOMMENDATIONS,uid,candidatesI,val);// finds recommendations
    return rec;
}



RecommendationsFromSet() {
      Thread worker = new Thread(new storiesClickProcess(nbRec,candidatesI,likedSet));
      worker.start();
      threads.add(worker);
    }
    int running = 0;
    do {
      running = 0;
      for (Thread thread : threads) {
        if (thread.isAlive()) {
          running++;
        }
      }
    } while (running > 0);

    if(val==1){
    List<Story> list1 = new ArrayList<Story>();
    for(Integer sid: storiesClicks.keySet()){
        list1.add(new Story(sid,storiesClicks.get(sid)));
    }
    Collections.sort(list1,new StoriesList());
    for(i=0;i<nbRec;i++){
        rec.add(list1.get(i).getSid());
    }
    }



    return rec;
}


   parGetClosestNeighbor() {
      Thread worker = new Thread(new formNetworkProcess(nbFriends,networkScore[i],profile,candidatesI,candidatesISet) );
      worker.start();
      threads.add(worker);
    }
    int running = 0;
    do {
      running = 0;
      for (Thread thread : threads) {
        if (thread.isAlive()) {
          running++;
        }
      }
    } while (running > 0);

    List<Network> list = new ArrayList<Network>();

    for(i=0;i<TASK_NUM;i++){
     for(Integer sid: networkScore[i].keySet()){
        list.add(new Network(sid,networkScore[i].get(sid)));

    }
    }

    Collections.sort(list,new NetworkList());
    for(i=0;i<nbFriends;i++){
        friends.add(list.get(i).getUid());
    }

    synchronized(network.get(uid)) {
        network.get(uid).clear();
        for( i=0;i<friends.size();i++){
            network.get(uid).add(friends.get(i));
        }

    }


    return friends;
}
getRecoFrom候选者(){
t=新线程(新KNN(uid、配置文件、候选线程));//KNN是否使用最近邻
rec=RecommendationsFromSet(NB_建议,uid,candidatesI,val);//查找建议
返回记录;
}
建议从集合()开始{
线程工作者=新线程(新存储ClickProcess(nbRec、candidatesI、likedSet));
worker.start();
线程。添加(worker);
}
int运行=0;
做{
运行=0;
用于(线程:线程){
if(thread.isAlive()){
运行++;
}
}
}同时(运行>0);
如果(val==1){
List list1=新的ArrayList();
for(整数sid:storiesClicks.keySet()){
列表1.add(新故事(sid,storiesClicks.get(sid));
}
Collections.sort(list1,newstorieslist());
对于(i=0;i=0);
列表=新的ArrayList();

对于(i=0;i如果您有多核CPU,top不是检查CPU使用情况的最佳命令。请使用sar

sar-p全部1000

这将每隔1秒打印1000次所有核心的使用情况

此外,我确实在您的代码中看到了synchronized关键字。这可能会导致争用。您可以使用vmstat或此命令验证这一点


cat/proc/PID/status

网络/内存有多忙?您可能正在最大化I/O请求,线程在此期间等待它完成不使用CPU。不,两个函数中的线程进程完全独立,没有I/O请求。它们传递了用于计算的参数,我验证了在这种情况下,同步不会引起任何争用。此外,线程独立工作,但仍然没有使用max cpuCan。正如我前面提到的,您转储sar命令的输出。还有,您正在运行多少应用程序线程?您有足够的线程来占用所有内核吗?还请记住,有cpu时钟即使在线程上下文切换中也会丢失周期。每个上下文切换都涉及在处理器缓存中读取完整的线程上下文。您好,我正在为8个内核运行8个线程。此外,在我使用Macbook时,上面的sar命令不起作用。使用sar 1 1000平均提供45-50%的总CPU使用率您可以尝试在Linux/Windows b上运行它吗ox?我只是想知道OSX是否做了一些逻辑,并防止任何线程占用100%的CPU来保持机器的活力。我目前没有linux,但会在一些服务器上尝试。正如你所说,OSX可能会做一些线程管理来防止完全使用。我将验证它