Java proc/stat空闲时间减少
我已经编写了一些代码,通过读取proc/stat中的第一行来计算android设备上的cpu负载,该行在大多数情况下运行良好,只是偶尔返回负值。进一步检查后,我意识到空闲时间值有时会减少,我创建了一个虚拟可运行类来演示此行为:Java proc/stat空闲时间减少,java,android,Java,Android,我已经编写了一些代码,通过读取proc/stat中的第一行来计算android设备上的cpu负载,该行在大多数情况下运行良好,只是偶尔返回负值。进一步检查后,我意识到空闲时间值有时会减少,我创建了一个虚拟可运行类来演示此行为: public class MyRunnable implements Runnable{ String[]cpuTimeInfo; long idle2; long idle1; @Override public void run
public class MyRunnable implements Runnable{
String[]cpuTimeInfo;
long idle2;
long idle1;
@Override
public void run() {
if (new File("/proc/stat").exists()) {
try{
BufferedReader br = new BufferedReader(new FileReader(new File("/proc/stat")));
String aLine;
while ((aLine = br.readLine()) != null){
if(aLine.substring(0, 3).equals("cpu")){
cpuTimeInfo = aLine.split("\\s+");
idle1 = Long.parseLong(cpuTimeInfo[4]);;
try{
Thread.sleep(1000);
br = new BufferedReader(new FileReader(new File("/proc/stat")));
aLine = br.readLine();
cpuTimeInfo = aLine.split("\\s+");
}
catch(InterruptedException e){
}
idle2 = Long.parseLong(cpuTimeInfo[4]);;
if(idle2 < idle1)
Log.d("????", "Idle 1: " + idle1 + " Idle 2: " + idle2);
break;
}
}
if (br != null) {
br.close();
}
}
catch (IOException | NumberFormatException e){
}
}
new Thread(this).start();
}
}
公共类MyRunnable实现Runnable{
字符串[]cpuTimeInfo;
长时间闲置2;
长时间闲置1;
@凌驾
公开募捐{
如果(新文件(“/proc/stat”).exists()){
试一试{
BufferedReader br=新的BufferedReader(新文件读取器(新文件(“/proc/stat”));
弦线;
而((aLine=br.readLine())!=null){
if(aLine.substring(0,3).equals(“cpu”)){
cpuTimeInfo=aLine.split(\\s+);
idle1=Long.parseLong(cpuTimeInfo[4]);;
试一试{
睡眠(1000);
br=新的BufferedReader(新文件读取器(新文件(“/proc/stat”));
aLine=br.readLine();
cpuTimeInfo=aLine.split(\\s+);
}
捕捉(中断异常e){
}
idle2=Long.parseLong(cpuTimeInfo[4]);;
如果(idle2
我在android设备上遇到了同样的问题。我认为idle列中的值实际上并没有随着时间的推移而减少,而是比以前低了三分之一。我的猜测是,它与每个CPU核心值的总和有关 但是我不知道如何解决这个问题。也许我们必须得到每个核心的值,然后自己做加法。不知道,我还没走那么远,我认为这太没有建设性了 解决方法实际上非常简单:为获得的每个idleX更新一个idle变量。如果新值低于idle,则跳过循环迭代。简单地说,这意味着跳过任何空闲时间不会逐渐增加的情况 这里有一些线索很好地说明了当前的问题。它定期转储/proc/stat的第一行。请看第五列,即从7米(错误)到10米(正确)的一列
不解决问题,而是使用
Thread.sleep(1000)
您可以使用TimeUnit.SECONDS.sleep(1L)
;此外,您还经常使用.split(\\s+”)
创建一个私有静态fnal模式SPACES=Pattern。编译(\\s+”
并使用空格.split()
。最后,使用ExecutorService
而不是线程
@fge好的,谢谢你的回复,我将空闲时间存储在一个变量中,当新的空闲时间低于前一个时跳过循环,我认为这已经足够好了,我同意,试图弄清楚这一点是浪费时间
Wed Mar 18 11:40:25 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392408 78027 265140 10190657 28775 74 3969 0 0 0]
Wed Mar 18 11:40:31 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392602 78031 265285 10195990 28794 74 3974 0 0 0]
Wed Mar 18 11:40:37 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392731 78049 265399 10197540 28804 74 3988 0 0 0]
Wed Mar 18 11:40:43 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392882 78058 265521 7938411 28655 74 4017 0 0 0]
Wed Mar 18 11:40:49 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392956 78058 265636 10199960 28827 74 4029 0 0 0]
Wed Mar 18 11:40:55 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393032 78058 265720 10201160 28836 74 4030 0 0 0]
Wed Mar 18 11:41:01 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393159 78059 265809 7941553 28668 74 4030 0 0 0]
Wed Mar 18 11:41:07 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393316 78070 265917 7942154 28679 74 4038 0 0 0]
Wed Mar 18 11:41:13 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393441 78085 266048 7943935 28691 75 4054 0 0 0]
Wed Mar 18 11:41:19 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393614 78086 266206 7950457 28704 75 4086 0 0 0]
Wed Mar 18 11:41:26 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393716 78086 266295 10213601 28875 75 4087 0 0 0]
Wed Mar 18 11:41:32 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393812 78086 266372 10214027 28875 75 4087 0 0 0]