首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代Thread.suspend()和.resume()

替代Thread.suspend()和.resume()
EN

Stack Overflow用户
提问于 2015-03-08 01:18:08
回答 6查看 14.4K关注 0票数 11

我有一大段代码不是一个循环,只是一个命令列表,这些命令只发生一次,但需要一些时间。我需要它根据一个变化的布尔值,在任意点暂停或终止这一点。我可以使用不同的线程来挂起、恢复和停止这段代码,但是这些方法是不推荐的,所以我想避免使用它们。我可以检查每一行代码之间的布尔值,但我希望找到一个更优雅的解决方案。有什么好办法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-03-08 04:44:32

当然,使用Thread#interrupt()来处理中断线程(在本例中是暂停或停止线程)的正确方法。它的设计使得您可以定义可以中断线程的安全点,对于您来说,这自然是每个任务之间的点。因此,为了避免手动检查每个任务之间的变量,并且能够轻松地恢复所中断的位置,您可以将任务存储为Runnable的列表,并记住您在列表中的位置,如下所示:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2015-03-08 01:29:25

关于为什么不推荐Thread.stop()Thread.pause()Thread.resume(),有一个很好的文档:

Java线程原语弃用

Thread.pause() / Thread.resume()还有一种使用waitnotify解释的替代方法。

票数 2
EN

Stack Overflow用户

发布于 2015-03-08 01:21:49

您可以使用等待/通知作为挂起/恢复的替代方法。您可以设置一个标志,通知并从已通知线程抛出异常,而不是停止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28922040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档