Thread.suspend()和.resume()的替代方法
我有很大一部分不是循环的代码,只是发生一次但要花费一些时间的命令列表。我需要它根据更改的布尔值在任何时候暂停或终止此操作。我可以使用其他线程来挂起,恢复和停止此代码,但是不赞成使用这些方法,因此我想避免使用它们。我可以检查每行代码之间的布尔值,但我希望有一个更优雅的解决方案。有什么好方法吗?
回答:
自然,使用来处理中断线程的正确方法(在这种情况下,是暂停或停止线程)Thread#interrupt()
。它的设计目的是使您可以定义线程可以中断的安全点,对您而言,安全点自然是每个任务之间的点。因此,为了避免在每个任务之间手动检查变量,并能够轻松地从上次中断的地方继续工作,可以将任务存储为的列表Runnable
,并记住上次中断时在列表中的位置,像这样:
public class Foo { public static void runTask(Runnable task) throws InterruptedException {
task.run();
if (Thread.interrupted()) throw new InterruptedException();
}
Runnable[] frobnicateTasks = new Runnable[] {
() -> { System.out.println("task1"); },
() -> { Thread.currentThread().interrupt(); }, //Interrupt self only as example
() -> { System.out.println("task2"); }
};
public int frobnicate() {
return resumeFrobnicate(0);
}
public int resumeFrobnicate(int taskPos) {
try {
while (taskPos < frobnicateTasks.length)
runTask(frobnicateTasks[taskPos++]);
} catch (InterruptedException ex) {
}
if (taskPos == frobnicateTasks.length) {
return -1; //done
}
return taskPos;
}
public static void main(String[] args) {
Foo foo = new Foo();
int progress = foo.frobnicate();
while (progress != -1) {
System.out.println("Paused");
progress = foo.resumeFrobnicate(progress);
}
System.out.println("Done");
}
}
-->
task1
Paused
task2
Done
以上是 Thread.suspend()和.resume()的替代方法 的全部内容, 来源链接: utcz.com/qa/418005.html