如何立即暂停一个线程?

时间:2013-04-07 21:46:13

标签: android thread-safety

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

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

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

当我按下一个为“暂停”字段赋值为true的按钮时,继续执行暂停之前的线程将完成if块中的所有操作。

如何立即暂停线程?

OR

如何强制在当前迭代结束时执行按钮回调?

修改

我以这种方式解决了:

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

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

1 个答案:

答案 0 :(得分:0)

立即暂停一个帖子有点复杂。这里的问题是,如果布尔值已经改变,你需要在每个行之后检查。这并不包括程序 从您的线程中调用的实际方法之一的时间。

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

如果它立即出现的原因是,当你点击暂停按钮时,你就会立即释放/取消资源:不要这样做。

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

相关问题