Почему ThreadMXBean.getThreadCpuTime возвращает то же время? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь использовать ThreadMXBean.getThreadCpuTime, чтобы получить процессорное время основного потока. Тем не менее, я получаю то же время, хотя поток, должно быть, проделал некоторую работу, на которую нужно время. Теперь я сомневаюсь в точности использования ThreadMXBean.getThreadCpuTime для получения времени ЦП. Мой пример кода ниже:

package edu.seu.juc.problem;

import java.lang.management.ManagementFactory;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TestGetThreadCpuTime {
    private static Lock lock = new ReentrantLock();
    /***
     *
     * @param args
     */
    public static void main(String[] args) {

        System.out.println("CPU time: " + ManagementFactory.getThreadMXBean().getThreadCpuTime(Thread.currentThread().getId())
                / (1000 * 1000));

        for (int i = 0; i < 8; i++) {
            lock.lock();


            Long startTime = System.currentTimeMillis();


            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Integer sum = 1;
            for (int j = 0; j < 1000000; j++) {
                sum += j;
            }
            System.out.println(sum);


            System.out.println("total: " + (System.currentTimeMillis() - startTime));
            System.out.println("CPU time: " + ManagementFactory.getThreadMXBean().getThreadCpuTime(Thread.currentThread().getId())
                    / (1000 * 1000));

            System.out.println("blocked time: " + ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId()).getBlockedTime());
            System.out.println("waited time: " + ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId()).getWaitedTime());

            lock.unlock();
        }
    }
}

Результат ниже

CPU time: 140
1783293665
total: 220
CPU time: 140
blocked time: -1
waited time: -1
1783293665
total: 217
CPU time: 156
blocked time: -1
waited time: -1
1783293665
total: 210
CPU time: 171
blocked time: -1
waited time: -1
1783293665
total: 215
CPU time: 187
blocked time: -1
waited time: -1
1783293665
total: 204
CPU time: 187
blocked time: -1
waited time: -1
1783293665
total: 203
CPU time: 187
blocked time: -1
waited time: -1
1783293665
total: 203
CPU time: 187
blocked time: -1
waited time: -1

Почему процессорное время сохраняет 187ms? Вроде неразумно.

1 Ответ

0 голосов
/ 28 мая 2020

Время, которое вы видите, зависит от поведения ОС вашего компьютера, от того, как ОС выполняет задачу. 187 мс, вы видите это сейчас, но если вы перезагрузите компьютер или запустите этот код в другое время, вы не увидите постоянного времени 187 мс. Я запустил вам код, и вот результат:

  main CPU time: 143
 1783293665
 total: 230
 main CPU time: 169
blocked time: -1
waited time: -1
1783293665
total: 235
main CPU time: 195
blocked time: -1
waited time: -1
1783293665
total: 215
main CPU time: 208
blocked time: -1
waited time: -1
1783293665
total: 218
main CPU time: 220
blocked time: -1
waited time: -1
1783293665
total: 207
main CPU time: 225
blocked time: -1
waited time: -1
1783293665
total: 209
main CPU time: 231
blocked time: -1
waited time: -1
1783293665
total: 209
main CPU time: 238
blocked time: -1
waited time: -1
1783293665
total: 215
main CPU time: 247
blocked time: -1
  waited time: -1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...