Java - 为什么这个基本的滴答类耗尽了这么多cpu?

时间:2018-01-24 00:04:04

标签: java multithreading cpu

详细信息: 对于我开发的程序很多,我使用这个代码(或一些轻微的变体)来经常“勾选”一个方法,设置为可变tps(如果设置为32,则它每秒调用方法滴答32次)。它非常重要,所以我无法将其从代码中删除,因为动画和各种其他部分都会破坏。

不幸的是,似乎使用了相当数量的cpu使用,这是我无法弄清楚的原因。前段时间我正在考虑使用thread.sleep()来解决这个问题但是根据this post;因为这需要合理准确的时间安排,所以这是不可行的,这使得它变得不可行。

它没有使用那么多的cpu,在我公认的短测试中,对于ryzen 1700大约6-11%的cpu,但考虑到它做得有多少,它仍然相当多。有没有一个较少的CPU密集的方法来完成这个?或者将时间安排为经常使用。

public class ThreadTest {

    public ThreadTest() {
        int tps = 32;

        boolean threadShouldRun = true;
        long lastTime = System.nanoTime();
        double ns = 1000000000 / tps;
        double delta = 0;
        long now;

        while (threadShouldRun) {
            now = System.nanoTime();

            delta += (now - lastTime) / ns;
            lastTime = now;

            while ((delta >= 1) && (threadShouldRun)) {
                tick();
                delta--;
            }
        }
    }

    public void tick() {

    }

    public static void main(String[] args) {
        new ThreadTest();
    }
}

基本摘要:上面的代码使用了6-11%的cpu和ryzen 1700,java中是否有一种方法可以在执行代码时以较少的CPU使用率和保持合理的时序来完成相同的代码每秒一定的次数。

1 个答案:

答案 0 :(得分:4)

不应使用尽可能多的CPU的一个简单替代方法是使用INET。例如:

ScheduledExecutorService

请注意,public static void main(String[] args) { ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); executor.scheduleAtFixedRate(() -> { }, 0, 31250, TimeUnit.MICROSECONDS); } 表示转换为微秒的31250秒的值,因为该参数接受1/32