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

时间:2015-02-12 15:25:48

标签: java multithreading swt dispose

退出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()方法?如果用户关闭应用程序窗口,那么使线程停止的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

所有控件在其父窗口关闭时处理,但通过调用其dispose方法(调用名为release的内部方法)。因此,如另一个答案中所述,您需要使用DisposeListener来了解处置。

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

答案 1 :(得分:1)

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

扩展Widget的每个类都允许注册DisposeListener(使用addDisposeListener()方法)。只要小部件处理完毕,您就会收到通知。

顺便说一下。如果if不为空并且您的主题字段名为this.checker

,您的myThread检查可能是拼写错误