java程序可以指定CPU运行吗?这是我以前遇到的一个面试问题,这两天又想起来了。一般我们都知道C、C++是可以实现程序指定CPU运行的,那么java到底可不可以呢?网上一部分人说可以,一部分人说不可以,我先说一下我搜集的资料显示是可以的,不过实现起来需要特殊的开发环境,主要就是需要安装jrockit-jdk

一、jrockit-jdk安装

  1. jrockit-jdk简介:
    Oracle JRockit JVM 是业界性能最高的 Java 虚拟机,现内置于 Oracle 融合中间件中。它通过 JRockit Real Time 提供业内领先的实时基础架构功能,通过 JRockit Mission Control 提供无与伦比的 JVM 诊断。

  2. 下载与安装:
    官网下载地址:https://www.oracle.com/java/technologies/javase-java-archive-jrockit-downloads.html
    在这里插入图片描述
    点击适合自己电脑的版本进行下载即可,下载完成后双击程序,按照程序提醒一步一步安装即可,跟普通jdk差别不大,安装完成以后:
    在这里插入图片描述
    jrockit-jdk安装完成以后,可以像普通的jdk那样进行环境变量配置:
    在这里插入图片描述
    到这里jrockit-jdk安装就算完成了。

二、编码测试

  1. 创建一个普通maven工程,需要选择刚刚安装好的jrockit-jdk:

在这里插入图片描述
项目结构:
在这里插入图片描述
3. 编码:

public class AppointCpuTest {

    public static void main(String[] args) {
        // 获取jvm对象
        JVM jvm = JVMFactory.getJVM();
        // 获取cpu集合的叠代对象
        Iterator<CPU> cpuIterator = jvm.getProcessAffinity().iterator();
        // 用于保存系统中所有cpu的集合
        List<CPU> systemCpuList = new ArrayList<CPU>();
        while (cpuIterator.hasNext()) {
            CPU cpu = cpuIterator.next();
            systemCpuList.add(cpu);
        }
        // 系统中cpu的个数
        int cpuCount = systemCpuList.size();
        // 需要绑定到jvm的cpu集合
        List<CPU> bindCpuList = new ArrayList<CPU>();
        // 绑定最后一个cpu运行此程序
        int appointCpuIndex = cpuCount - 1;
        bindCpuList.add(systemCpuList.get(appointCpuIndex));
        // 将指定的cpu集合绑定到jvm中
        jvm.suggestProcessAffinity(bindCpuList);

        System.out.println("系统中CPU个数:" + cpuCount);
        System.out.println("当前程序指定CPU运行序号:" + appointCpuIndex);

        //保持程序不退出
        while (true) {

        }
    }
}
  1. 运行结果:
系统中CPU个数:6
当前程序指定CPU运行序号:5

在这里插入图片描述
将指定CPU序号换成3,再次运行:

int appointCpuIndex = 3;
bindCpuList.add(systemCpuList.get(appointCpuIndex));

运行结果:

系统中CPU个数:6
当前程序指定CPU运行序号:3

在这里插入图片描述

从以上两次运行结果都可以看出来,代码成功实现了让程序在指定的CPU上运行。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐