当前位置: 首页 > news >正文

java单机多核怎么实现的_JAVA实现对于多核CPU的OS满足CPU使用率在50%左右以及实现CPU使用率为正弦曲线-Go语言中文社区...

参考自一位大牛:

前言

今天看了下《编程之美》的第一章 第一节 让CPU占用率曲线听你指挥,感觉很有意思。在网上找了很多大牛写的方法,但是没找到详细介绍JAVA怎么在多核OS中实现这样效果的。

思考

对于单核CPU的OS,网上提供了很多解法。如下代码:

public static void main(String args[]) throws InterruptedException{

int busyTime = 50;//可调节参数,单位为ms。50ms后线程休眠50毫秒,然后再经系统调度

int idleTime = busyTime;

while(true){

long startTime = System.currentTimeMillis();

//busy loop:

while((System.currentTimeMillis()-startTime)<=busyTime)

;

try {

Thread.sleep(idleTime);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

若要在多核CPU的OS也满足 CPU使用率停留在50%左右,那么只需有多少个核,则开启多少个线程执行上述操作。(每一个CPU(其实是每核),在同一时间,只工作一条线程)。因此,只需获得当前系统的CPU核数,再创建多个线程即可

Java实现多核CPU满足50%CPU使用率

实现代码如下:

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Test {

public static void main(String args[]) throws InterruptedException{

Runtime r = Runtime.getRuntime();//获得当前系统的CPU数量,根据这个数值创建对应数量的线程

ExecutorService pool = Executors.newFixedThreadPool(r.availableProcessors());

for (int i = 0;i < r.availableProcessors();i++){

pool.execute(new Loop());

}

pool.shutdown();

}

}

class Loop implements Runnable{

@Override

public void run() {

int busyTime = 50;//可调节参数,单位为ms。50ms后线程休眠50毫秒,然后再经系统调度。该数值越小,则线程被调度得越频繁,则CPU使用率也就越高(平均)

int idleTime = busyTime;

while(true){

long startTime = System.currentTimeMillis();

//busy loop:

while((System.currentTimeMillis()-startTime)<=busyTime)

;

try {

Thread.sleep(idleTime);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

效果图如下:(将所有CPU一张表显示)

69783bf5124f31b10a98ba417d1cf37d.png

Java实现多核CPU使用率为正弦曲线

代码及个人解释如下:

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Test {

public static void main(String[] args) throws Exception {

Runtime r = Runtime.getRuntime();//获得当前系统的CPU数量,根据这个数值创建对应数量的线程

ExecutorService pool = Executors.newFixedThreadPool(r.availableProcessors());

for (int i = 0;i < r.availableProcessors();i++){

pool.execute(new Loop());

}

pool.shutdown();

}

}

class Loop implements Runnable{

@Override

public void run() {

/*

int busyTime = 50;//可调节参数,单位为ms。50ms后线程休眠50毫秒,然后再经系统调度

int idleTime = busyTime ;

while(true){

long startTime = System.currentTimeMillis();

//busy loop:

while((System.currentTimeMillis()-startTime)<=busyTime)

;

try {

Thread.sleep(idleTime);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

*/

// 角度的分割

final double SPLIT = 0.01;

// 2PI分割的次数,也就是2/0.01个,正好是一周

final int COUNT = (int) (2 / SPLIT);

final double PI = Math.PI;

// 时间间隔

final int INTERVAL = 200;

long[] busySpan = new long[COUNT];

long[] idleSpan = new long[COUNT];

int half = INTERVAL / 2;

double radian = 0.0;

/*对busySpan和idleSpan数组赋值

busySpan:100 102 104 ... 200 198 196 ... 100 98 96 ... 0 2 4 ... 100 循环

idleSpan: 100 98 96 ... 0 2 4 ... 100 102 104 ... 200 198 196 ... 100 循环

对于CPU,每次先工作busySpan[i]ms,再休眠idleSpan[i]ms。一次循环分四个阶段解读:

阶段一:busySpan : 100 -> 200 idleSpan: 100 -> 0 在此阶段,CPU利用率整体呈上升(busySpan[i] - idleSpan[i] >= 0),

且每经过一个busySpan[i]和idleSpan[i]之后,曲线上升的幅度相比前一次更大,因为busySpan[i] - idleSpan[i]

递增

阶段二:busySpan: 200 -> 100 idleSpan: 0 -> 100 分析同上,此阶段CPU利用率整体仍呈上升趋势,但每一次上升幅度比前

一次上升幅度小

阶段三:busySpan: 100 -> 0 idleSpan: 100 -> 200 在此阶段,CPU利用率呈下降趋势,且下降幅度越来越大

阶段四:busySpan: 0 -> 100 idleSpan: 200 -> 100 在此阶段,CPU利用率继续呈下降趋势,下降幅度越来越小

最后,循环上述四个阶段

*/

for (int i = 0; i < COUNT; i++) {

busySpan[i] = (long) (half + (Math.sin(PI * radian) * half));

idleSpan[i] = INTERVAL - busySpan[i];

radian += SPLIT;

}

long startTime = 0;

int j = 0;

while (true){

j = j % COUNT;

startTime = System.currentTimeMillis();

while (System.currentTimeMillis() - startTime < busySpan[j])

;

try {

Thread.sleep(idleSpan[j]);

} catch (InterruptedException e) {

e.printStackTrace();

}

j++;

}

}

}

效果图如下:

41daa415755d8650e454e5aeedeac67e.png

相关文章:

  • java序列化第二次出错_1.2.28反序列化类bug java.lang.VerifyError:
  • java对mysql读写权限设置_Mac 配置java版本 ---- MySql数据库权限设置 --- openfire
  • java中英对比_中英文代码对比系列之Java一例
  • java 算术字符串_java-从定义为字符串的运算符执行算术运算
  • c#项目 java项目_c#项目转Java项目!!!!!
  • mysql 创建xml字段_用MySQL和PHP创建XML
  • java实现 一维装箱问题_c语言来实现贪心算法之装箱问题
  • hmcl电脑java我的世界启动器_hello minecraft下载
  • 强制停止java_java – 如何强制停止Android应用程序
  • acacm icpc java_用Latex高效整理你的ACM-ICPC模板
  • java getmethods_java – 什么决定了Class.getMethods()的返回顺序?
  • java mapper xml 参数_Mybatis 文档篇 3.4:Mapper XML 之 Parameters
  • java类的加载是jvm,JVM学习(一):Java类的加载机制
  • PHP一点上传文件时下载文件啦,PHP中上传大体积文件时需要的设置
  • php big5 转utf8,php如何实现big5转utf8
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Android Studio:GIT提交项目到远程仓库
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • java8-模拟hadoop
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • opencv python Meanshift 和 Camshift
  • Python 基础起步 (十) 什么叫函数?
  • Vue实战(四)登录/注册页的实现
  • 深入浅出webpack学习(1)--核心概念
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 我的zsh配置, 2019最新方案
  • 我看到的前端
  • 移动端唤起键盘时取消position:fixed定位
  • - 转 Ext2.0 form使用实例
  • MPAndroidChart 教程:Y轴 YAxis
  • # .NET Framework中使用命名管道进行进程间通信
  • #define 用法
  • #单片机(TB6600驱动42步进电机)
  • (1)(1.9) MSP (version 4.2)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (LeetCode C++)盛最多水的容器
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (算法)前K大的和
  • (万字长文)Spring的核心知识尽揽其中
  • (新)网络工程师考点串讲与真题详解
  • **CI中自动类加载的用法总结
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net web项目 调用webService
  • ;号自动换行
  • @Autowired和@Resource的区别
  • [ C++ ] STL---string类的模拟实现
  • [AIGC] MySQL存储引擎详解
  • [Android]如何调试Native memory crash issue
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C# 开发技巧]实现属于自己的截图工具
  • [FC][常见Mapper IRQ研究]
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • [HDU]2161Primes