我有一个布尔字段为“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循环的当前迭代结束时)。我还有一个疑问: 这是一个好习惯吗?
答案 0 :(得分:0)
立即暂停一个帖子有点复杂。这里的问题是,如果布尔值已经改变,你需要在每个行之后检查。这并不包括程序 从您的线程中调用的实际方法之一的时间。
如果您需要线程立即结束,取消。这将中断在该线程上完成的工作,并立即停止。之后,你必须重新启动它。
如果它立即出现的原因是,当你点击暂停按钮时,你就会立即释放/取消资源:不要这样做。
最好的方法是将游戏循环设计为仅在while
- 循环开始时执行任何“更改级别”或其他重新配置的内容。当循环开始一个新的循环时,它应该保证循环将完全执行。