Java 添加一个没有Thread.sleep的延迟和一个while循环

Java 添加一个没有Thread.sleep的延迟和一个while循环,java,multithreading,delay,sleep,Java,Multithreading,Delay,Sleep,我需要在不使用Thread.sleep()或while循环的情况下添加延迟。 游戏im编辑(Minecraft)时钟以“滴答”为单位运行,但它们可能会根据您的FPS而波动 public void onTick() {//Called every "Tick" if(variable){ //If my variable is true boolean = true; //Setting my boolean to true /**

我需要在不使用Thread.sleep()或while循环的情况下添加延迟。 游戏im编辑(Minecraft)时钟以“滴答”为单位运行,但它们可能会根据您的FPS而波动

public void onTick() {//Called every "Tick"
    if(variable){ //If my variable is true
            boolean = true; //Setting my boolean to true
            /**
            *Doing a bunch of things.
            **/
            //I need a delay for about one second here.
            boolean = false; //Setting my boolean to false;
    }
}
我需要延迟的原因是,如果我没有延迟,代码运行得太快,错过了它,无法切换。

long start=new Date().getTime();
long start = new Date().getTime();
while(new Date().getTime() - start < 1000L){}
while(new Date().getTime()-start<1000L){}
这是我能想到的最简单的解决办法

尽管如此,堆可能会被许多未引用的
Date
对象污染,这取决于创建这种伪延迟的频率,可能会增加GC开销


在一天结束时,您必须知道,与
Thread.sleep()
解决方案相比,在处理器使用方面,这并不是更好的解决方案。

类似于以下内容的内容可以在不中断游戏线程的情况下为您提供所需的延迟:

private final long PERIOD = 1000L; // Adjust to suit timing
private long lastTime = System.currentTimeMillis() - PERIOD;

public void onTick() {//Called every "Tick"
    long thisTime = System.currentTimeMillis();

    if ((thisTime - lastTime) >= PERIOD) {
        lastTime = thisTime;

        if(variable) { //If my variable is true
            boolean = true; //Setting my boolean to true
            /**
            *Doing a bunch of things.
            **/
            //I need a delay for about one second here.
            boolean = false; //Setting my boolean to false;
        }
    }
}
方法之一是:

class Timer {
            private static final ScheduledExecutorService scheduledThreadPoolExecutor = Executors.newScheduledThreadPool(10);
    
            private static void doPause(int ms) {
                try {
                    scheduledThreadPoolExecutor.schedule(() -> {
                    }, ms, TimeUnit.MILLISECONDS).get();
                } catch (Exception e) {
                    throw new RuntimeException();
                }
            }
        }

然后您可以在需要的地方使用
Timer.doPause(50)

为什么不能使用
Thread.sleep()
?添加任意延迟,因为代码“运行太快”是一种主要的代码味道。在大多数情况下,一次占用整个线程一秒钟也是完全不可接受的。更多细节将有助于您在此处找到更好的解决方案。我不能使用Thread.sleep(),因为它会在您设置的时间内冻结整个游戏。那么,您认为设置一些任意循环对我们有何帮助?Thread.sleep不像循环那样消耗CPU周期……听起来您有设计问题。你需要一个单独的线程来处理游戏模型的更新,安排重新绘制和控制帧速率,使用类似线程的东西。睡眠…我几乎肯定你是在你的头上,这不会像你认为的那样工作。你需要对线程做一些研究。真正的问题是,为什么你认为你需要延期?因为我保证这是错误的解决方案。System.currentTimeMillis将减少GC问题。但这将消耗CPU周期,降低系统性能……此外,他在问题中说,“没有一个while循环什么都不做”。