Adding a delay without Thread.sleep and a while loop doing nothing

前端 未结 3 716
灰色年华
灰色年华 2021-01-05 02:39

I need to add delay without using Thread.sleep() or a while loop doing nothing. The game im editing(Minecraft) clock runs on \"Ticks\" but they can fluctuate depending on yo

相关标签:
3条回答
  • 2021-01-05 03:21
    long start = new Date().getTime();
    while(new Date().getTime() - start < 1000L){}
    

    is the simplest solution I can think about.

    Still, the heap might get polluted with a lot of unreferenced Date objects, which, depending on how often you get to create such a pseudo-delay, might increase the GC overhead.

    At the end of the day, you have to know that this is no better solution in terms of processor usage, compared to the Thread.sleep() solution.

    0 讨论(0)
  • 2021-01-05 03:23

    Something like the following should give you the delay you need without holding up the game thread:

    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;
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-05 03:27

    One of approaches is :

    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();
                    }
                }
            }
    

    and then you can use Timer.doPause(50) where you need.

    0 讨论(0)
提交回复
热议问题