java - 等待特定时间但不干扰应用程序的任何其他功能

标签 java multithreading wait

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

首先,我想通过带有 TimeUnit.MILLISECONDS.sleep()for 循环以及其中的值递减来完成此操作:

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。/* Thread 是一次性产品吗...? */

我尝试的最后一件事确实有效,那就是每次需要时创建一个新线程。这就是我目前拥有的:

new Thread(() -> {
    for (int i = 0; i <= 100; i++) {
        decrementBatteryLevel();
        try {
            TimeUnit.MILLISECONDS.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

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

谢谢。

最佳答案

使用 ExecutorService 启动任务。

Executors.newSingleThreadExecutor();

然后,您可以提交您的RunnableCallable来获取相应的Future

final Future<?> submittedResult = executorService.submit(() -> { /* Your code */ });

启动新任务实例时,只需取消提交

submittedResult.cancel(true);
executorService.submit(() -> { /* Your code */ });

我认为您可以针对您的特定用例扩展我的答案。
另请参阅https://techblog.bozho.net/interrupting-executor-tasks/

关于java - 等待特定时间但不干扰应用程序的任何其他功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54638923/

相关文章:

java - 不可变数组的近似中位数

java - 将 xls 转换为图像

java - Spring Webflux : How to use different thread for request and response

java - 我如何测量java中线程池的时间?

java - 将数据从 jsp 迭代器发送回 struts 操作类

C++:当每个线程都应该同时执行 I/O 和 CPU 密集型任务时的多线程设计

swift 4 : how to wait for a MKMapView to be loaded before adding pins

javascript - 等待请求结束FullScreen

ios - 在加载时显示等待警报 View

c++ - 自旋锁定堆栈和内存屏障 (C++)