Thread.suspend()和.resume()的替代方法

Yesennes:

我有很大一部分代码不是循环的,只是发生一次但需要一些时间的命令列表。我需要它根据更改的布尔值在任何时候暂停或终止此操作。我可以使用其他线程来挂起,恢复和停止此代码,但是不赞成使用这些方法,因此我想避免使用它们。我可以检查每行代码之间的布尔值,但我希望有一个更优雅的解决方案。有什么好方法吗?

维特鲁威:

自然,使用来处理中断线程的正确方法(在这种情况下,是暂停或停止线程)Thread#interrupt()它的设计目的是使您可以定义线程可以中断的安全点,这对您来说自然是每个任务之间的点。因此,为了避免在每个任务之间手动检查变量,并能够轻松地从上次中断的地方继续工作,可以将任务存储为Runnables 的列表,并记住上次中断时在列表中的位置,像这样:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章