【问题标题】:How do I stop a custom Thead in SWT application?如何在 SWT 应用程序中停止自定义 Thead?
【发布时间】:2015-02-12 15:25:48
【问题描述】:

当我退出我的 SWT 应用程序时如何停止自定义线程?

MyThread 无限循环运行,直到某个条件成立:

class MyThread extends Thread {

  @Override
  public void run() {
     do {
        // Do stuff...
     }
     while (!this.isInterrupted() && otherCondition);

}

在我的 SWT 应用程序中,我确实启动了线程并尝试在 SWT 组合的 dispose() 方法中停止。但是,这个方法永远不会被调用。

class MyComposite extends Composite {

    private MyThread myThread = null;

    @Override
    public void dispose() {
      super.dispose();

      if (null != this.myThread) {
         this.myThread.interrupt();
      }
    }

    public void somewhere() {
       this.myThread = new MyThread();
       this.myThread.start();
    }
}

现在,我可能已经关闭了我的 SWT 应用程序窗口,但线程仍在运行(它仍然会创建调试输出)。 dispose() 方法不是自动调用的吗?如果用户关闭应用程序窗口,使线程停止的最佳方法是什么?

【问题讨论】:

    标签: java multithreading swt dispose


    【解决方案1】:

    所有控件都在其父窗口关闭时被释放,但不是通过调用它们的dispose 方法(调用一个名为release 的内部方法)。因此,正如另一个答案中提到的,您需要使用DisposeListener 来了解处置情况。

    您的线程也可以调用setDaemon(true) - JVM 在关闭应用程序时不会等待守护线程停止。

    【讨论】:

    • 附录:方法setDaemon()必须在线程启动前调用。
    • 设置守护进程标志看起来是个不错的解决方案,因为它可以在线程的构造函数中设置,并且无需担心在 SWT 中停止线程。
    【解决方案2】:

    您必须自己 dispose() 您的小部件。我不知道你是如何摆脱你的小部件的,因为 sn-p 不包含任何代码。

    每个扩展Widget 的类都允许注册DisposeListener(使用addDisposeListener() 方法)。一旦小部件被释放,您就会收到通知。

    顺便说一句。你可能有一个错字,你的if 检查this.checker 是否不为空并且你的线程字段被命名为myThread

    【讨论】:

    • this.checker 确实是我的错。谢谢,我修好了。另外我删除了停止标志,因为我也可以在这里使用interrupt()isInterrupted()。所以没有必要再引入一个停止标志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多