详细信息: 对于我开发的程序很多,我使用这个代码(或一些轻微的变体)来经常“勾选”一个方法,设置为可变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使用率和保持合理的时序来完成相同的代码每秒一定的次数。
答案 0 :(得分:4)
不应使用尽可能多的CPU的一个简单替代方法是使用INET
。例如:
ScheduledExecutorService
请注意,public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
}, 0, 31250, TimeUnit.MICROSECONDS);
}
表示转换为微秒的31250
秒的值,因为该参数接受1/32
。