猿问

等待特定的时间,但不要打扰应用程序的任何其他功能

在我的游戏中,我将实现一个函数,在 5 秒内将变量的值从 100 线性更改为 0。该函数必须由玩家触摸按钮来启动。


首先,我想通过一个for循环来做到这一点,其中TimeUnit.MILLISECONDS.sleep()的值递减:


for (int i = 0; i <= 100; i++) {

    decrementBatteryLevel();

    try {

        TimeUnit.MILLISECONDS.sleep(50);

    } catch (InterruptedException e) {

        e.printStackTrace();

    }

}

但我很快发现,这会导致我的整个游戏停止 5 秒,这不是我想要的。所以我真正尝试的第一件事是创建一个运行for循环的线程:


private Thread useBattery = new Thread(() -> {

    for (int i = 0; i <= 100; i++) {

        decrementBatteryLevel();

        try {

            TimeUnit.MILLISECONDS.sleep(50);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

});

并在必要时调用它:


useBattery.start();

这有效,但仅适用于第一次启动。useBattery线程的第二次发射导致java.lang.IllegalThreadStateException游戏抛出。


我知道我无法启动一个已经存在的线程,所以我尝试这样做:


if (useBattery.isAlive()) {

    useBattery.interrupt();

}

useBattery.start();

但我最终java.lang.IllegalThreadStateException又被扔了。/* 线程是一次性产品吗...?*/


我尝试的最后一件事并且实际上有效的是每次我需要时都创建一个新线程。所以这就是我目前拥有的:


new Thread(() -> {

    for (int i = 0; i <= 100; i++) {

        decrementBatteryLevel();

        try {

            TimeUnit.MILLISECONDS.sleep(50);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}).start();

这样做的结果是令人满意的,但我担心这样做会很快用不必要的“用完”线程填满 RAM。有什么办法可以做得更好吗?


谢谢你。


有只小跳蛙
浏览 99回答 1
1回答

MYYA

使用 anExecutorService启动任务。Executors.newSingleThreadExecutor();然后你可以submit你的Runnable或Callable得到一个对应的Future。final Future<?> submittedResult = executorService.submit(() -> { /* Your code */ });当启动一个新的任务实例时,简单cancel地submitsubmittedResult.cancel(true);executorService.submit(() -> { /* Your code */ });我认为您可以针对您的特定用例扩展我的答案。另外,请参阅https://techblog.bozho.net/interrupting-executor-tasks/
随时随地看视频慕课网APP

相关分类

Java
我要回答