代码之家  ›  专栏  ›  技术社区  ›  user5644457

Java—为什么这个基本的ticking类会占用这么多cpu?

  •  3
  • user5644457  · 技术社区  · 8 年前

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

    不幸的是,它似乎使用了相当大的cpu使用量,原因我搞不清楚。不久前,我在考虑使用线程。sleep()修复此问题,但根据 this post ; 这是相当不准确的,这使得它不可行,因为这需要合理准确的时间。

    它并没有使用太多的cpu,在我公认的短期测试中,ryzen 1700的cpu约为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();
        }
    }
    

    基本总结: 上面的代码在ryzen 1700上使用了6-11%的cpu,在java中是否有办法以较少的cpu使用量完成相同的代码,并且在每秒执行一定次数的代码时保持合理的计时。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Jacob G.    8 年前

    一个不应该使用那么多CPU的简单替代方法是使用 ScheduledExecutorService . 例如:

    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
    
        executor.scheduleAtFixedRate(() -> {
    
        }, 0, 31250, TimeUnit.MICROSECONDS);
    }
    

    请注意 31250 表示的值 1/32 秒转换为微秒,因为该参数接受 long .