如何停止 SWT 应用程序中的自定义 Thead?

How do I stop a custom Thead in SWT application?

如何在退出 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 应用程序 window,但线程保持 运行(它仍然创建调试输出)。 dispose() 方法不是自动调用的吗?如果用户关闭应用程序,使线程停止的最佳方法是什么 window?

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

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

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

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

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