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

回到顶部