当前位置: 首页 > 面试题库 >

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

贺浩壤
2023-03-14
问题内容

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


问题答案:

自然,使用来处理中断线程的正确方法(在这种情况下,是暂停或停止线程)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


 类似资料:
  • 问题内容: 我正在尝试学习如何在Java中暂停和恢复线程。我使用的是有2个按钮“开始”和“停止”。 线程的运行方法: 现在,每当我尝试暂停或恢复线程时,都会引发异常: 笔记: 如果我使用不推荐使用的方法和,则先前的代码可以完美运行,但是文档指出使用和而不是同步。我尝试将单词添加到方法中,但仍会引发异常。 有人可以解释 为什么 这不起作用以及如何解决同步问题吗?很少有解释要点真的有多大帮助;) 问题

  • 问题内容: PHP_excel是否有其他选择可以以自定义格式“导出到XLSX / XLS”文件? 问题答案: 我编写了一个非常简单的类,用于导出到“ Excel XML”(又名SpreadsheetML)。对于最终用户而言,它不如XSLX方便(取决于文件扩展名和Excel版本,他们可能会收到警告消息),但使用起来比XLS或XLSX容易得多。

  • 问题内容: 对于像 制作视频的人相信 在许多情况下,冬眠过大 基本的sql是一种很好的语言,它可以将很多冬眠抽象化 我想听听他们如何比较,以及每个人的优缺点。 问题答案: 在这里,您可以找到Java ORM和持久性解决方案的详尽列表。并非所有以下Hibernate / JPA方法都遵循,其中某些方法在设计上相当容易。 当然,该站点上没有列出解决方案,例如带有模板的Spring JDBC等 。对于需

  • 问题内容: 我目前有这样的代码: 但是,这可能会在将来导致难以发现的错误,因为读者可能不会注意到上面出现的错误。或者,贡献者可能会错误地添加,而忘记添加。 我如何避免这种陷阱? 问题答案: 这样,实际上是一个“全局”。可以从任何地方对其进行读写。 与字典的替代方法相比,我更喜欢这种方法,因为它可以自动完成变量名。

  • 我一直在通过Netbeans使用CodeNameOne设计一个应用程序,并遇到了一些问题,特别是“找不到符号”编译错误。经过进一步的研究,我发现这是由于CNO不支持某些库/杂项。 我想知道是否有其他方法可以使用以下库/执行任务: (从文件读取)导入java.io.file;符号:类文件位置:package java.io (抛出FileNotFoundException)导入java.io.Fil

  • 本文向大家介绍Java中替代equals,compareTo和toString的方法,包括了Java中替代equals,compareTo和toString的方法的使用技巧和注意事项,需要的朋友参考一下 我们都曾在POJO中重写过equals(),compareTo()和toString()方法。但是另有其他能做到职责分离的更好的方法并带来更简洁的代码。阅读这篇文章来一探究竟吧! 更简明的职责——