当前位置: 首页 > 知识库问答 >
问题:

Java-为什么这个基本的滴答类会占用这么多cpu?

慕光霁
2023-03-14

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

不幸的是,它似乎使用了大量的cpu,原因我不知道。不久前,我在考虑使用thread.sleep()来解决这个问题,但根据这篇文章;它相当不准确,这使得它不可行,因为这需要相当准确的时间。

它没有使用那么多的cpu,在我承认的简短测试中,ryzen 1700的cpu大约是6-11%,但考虑到它的作用有多少,它仍然很多。有没有一种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个答案

汲昊空
2023-03-14

一个不应该使用太多 CPU 的简单方法就是使用计划卓越服务。例如:

public static void main(String[] args) {
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

    executor.scheduleAtFixedRate(() -> {

    }, 0, 31250, TimeUnit.MICROSECONDS);
}

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

 类似资料:
  • 我在中使用带有4.1版本模拟器的android最新版本sdk。一切都很好。但是在我的中,对于任何应用程序的每次运行,我都会得到以下语句。 即使在Hello world应用程序中,我也得到相同的logcat输出。我没有在我的应用程序中使用多线程。有人能告诉我为什么在我的logcat中得到这些日志。 这是我的密码 在我的异步任务中,我从服务器获取JSONArray,解析它并列出。

  • 我需要帮助我的错误就像 代码:

  • 像pdftable和pdfCell,都是操作table的为啥没有单独在pdf packege下面开一个table的包分类呢。 这样大量的类在同一个包下都很难找哇

  • 长期以来, Nutz的主要文档 Nutz手册 Wendal博客上的Nutz分类 这些文档均不是引导式的,而我之前做的各种努力也是针对特定的问题: Nutz每日一发 社区常见问答 Part 1 所以,我尝试用这种引导式的指南,让大家正确使用nutz,按nutz的思路来使用nutz 这本书正在紧张编著中,内容随时更新,更新进度主要看wendal的心情,哈哈

  • 如果你知道为什么会这样,为什么还会这样,请告诉我,这是我的代码:

  • 这个sql查询要6s多,但是我两张表数据量都不是很大呀。box_api_data目前40000条,box_data_info目前10006条。基本都是比较少的,这么个数据量连接查询居然干到了6s,是我sql有问题吗?目前两张表都没有索引。