【问题标题】:Stopping/Interrupting an operation停止/中断操作
【发布时间】:2015-10-05 10:21:17
【问题描述】:

我有一个 Java 项目,它使用 JSoup 解析 html 页面并在 Excel 电子表格(.xls 文件)中写入一些日期。

在框架中有一个“停止操作”按钮,因此用户可以停止任务,但该按钮在解析/写入结束之前不起作用。 框架中的“X 按钮”具有相同的行为。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你目前是如何阻止它的?
  • 这是一个相当广泛的问题。你试过什么?
  • 1.请不要在标题中写“in Java”。当它被标记为Java时就足够了。 2. 到目前为止你尝试过什么?您尝试了哪些来源?

标签: java parsing operation cancel-button


【解决方案1】:

很可能您所做的是将长时间运行的代码放在主线程上。如果您这样做,您的按钮将无法与工作交互并停止工作。

您需要将工作转移到另一个线程,然后让该线程定期检查(例如,在每个小工作单元之后)它是否被礼貌地要求停止(通过设置标记为 @987654321 @ 这样线程就不会缓存值并且看不到更新)。

确保您不会陷入为此使用Thread.stop() 的陷阱,这是不推荐使用的,并且有充分的理由。您需要确保您的工作线程与主线程协作以在被要求停止时停止。

【讨论】:

    【解决方案2】:

    你应该把所有的解析和写入操作放在一个外部线程中,如果用户点击停止操作按钮,则中断该线程。

    这是一个关于如何使用线程中断的示例:http://www.tutorialspoint.com/javaexamples/thread_interrupt.htm

    【讨论】:

    • 如果外螺纹不起作用,例如因为操作不能被中断,你需要把它放在另一个进程中,你可以杀死它。
    • 虽然中断线程并不一定会做任何事情;您必须在该线程中实现逻辑才能适当地处理中断。
    • 使用Thread.currentThread().isInterrupted() 不是很可靠,因为有很多事情可以清除线程的中断状态。最好使用一个volatile boolean 标志,worker 方法应该定期检查它是否应该停止。
    • 你是对的。当然,使用 volatile 布尔值来询问线程是否可以被中断似乎是干净代码的好选择。当然,被中断的线程应该实现一些逻辑来处理中断。但这在链接的示例中显示得很清楚。
    • @javatutorial 链接的例子太可怕了。 work2 方法只会在线程被中断后进入if 块(if 可能应该是if ( ! Thread.currentThread().isInterrupted() ) - 注意!)。在那之前,它只是在忙碌的等待中,不断地通过while (true)
    猜你喜欢
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多