Java proc/stat空闲时间减少

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

我已经编写了一些代码,通过读取proc/stat中的第一行来计算android设备上的cpu负载,该行在大多数情况下运行良好,只是偶尔返回负值。进一步检查后,我意识到空闲时间值有时会减少,我创建了一个虚拟可运行类来演示此行为:

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]