1

我有一个带有布尔字段“暂停”的线程,我用它来暂停线程。

public void run() {
    while (running) {
        if (!paused) {
            //HERE I do some operations
        }
    }
}

但是这个解决方案给我带来了一个问题:

当我按下一个将 true 分配给“暂停”字段的按钮时,继续暂停之前的线程会完成 if 块中的所有操作。

我该怎么做才能立即暂停线程?

或者

我能做些什么来强制按钮回调在当前迭代结束时执行?

编辑:

我以这种方式解决了:

public void run() {
    while (running) {
        synchronized(paused) {
            if (!paused) {
            //HERE I do some operations
            }
        }
    }
}

public void disablePause() {
    synchronized(paused) {
        paused = false;
    }
}

public void pause() {
    synchronized(paused) {
        paused = true;
    }
}

paused now 是一个布尔对象。执行按钮回调函数(调用 pause()、执行一些操作并调用 disablePause())的主 UI 线程等待直到我的自定义线程释放暂停(即在 while 循环的当前迭代结束时)。我仍然有一个疑问:这是一个好习惯吗?

4

1 回答 1

0

立即暂停线程有点复杂。这里的问题是,如果布尔值发生了变化,您需要在每一行之后检查。这不包括程序处于从您的线程调用的实际方法之一中的时间。

如果您需要线程立即结束,请取消它。这将中断在该线程上完成的工作并立即停止。之后,您必须重新启动它。

如果它必须立即执行的原因是,当按下暂停按钮时,您正在立即释放/取消验证资源:不要那样做。

最好的方法是将您的游戏循环设计为仅在您的循环开始时执行任何“级别更改”或其他重新配置的东西while。当循环开始一个新的循环时,它应该保证循环将被完全执行。

于 2013-04-07T22:07:51.627 回答