SwingWorker.cancel(真);不适用于java

时间:2014-08-12 04:12:51

标签: java swing concurrency swingworker

这是我的java代码的一部分,在这里我试图在使用SwingWorker.cancel(true)完成之前终止线程;方法,但这不起作用,所以请帮助。

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;


public class A extends SwingWorker<Void,Void> {

    JProgressBar p = new JProgressBar(0,100);
    JFrame f = new JFrame();
    static A a;

    public static void main(String arg[]) {
        a = new A();
        a.execute();
    }

    public Void doInBackground() {
        f.add(p);
        f.setSize(500,100);
        f.setVisible(true);

        for(int i=0; i<101; i++) {
            p.setValue(i);
            try{Thread.sleep(30);}catch(Exception e){}
            if(i==50)
                a.cancel(true);
        }
        return null;
    }

}

2 个答案:

答案 0 :(得分:4)

取消处理实际上是您的责任 - 这不是摆动工作者的固有属性。来自文档:"The task must cooperate with its own cancellation ...。有两种方法可以做到这一点:

  • 通过接收中断时终止。 Interrupts in Concurrency中描述了此过程。
  • 通过短时间间隔调用SwingWorker.isCancelled。如果已为此SwingWorker调用cancel,则此方法返回true。

对于您的问题,第二个显然适用。每次迭代,检查任务是否已被取消。如果是这样,请返回。在这段代码中,我已经将取消移动到主线程,因为告诉自己取消的任务没有那么多意义(只是返回),但是在工作线程中取消应该没问题。

public class A extends SwingWorker<Void,Void> {

  JProgressBar p = new JProgressBar(0,100);
  JFrame f = new JFrame();
  static A a;

  public static void main(String arg[]) throws InterruptedException {
      a = new A();
      a.execute();
      Thread.sleep(2000);
      System.out.println(a.cancel(true));
  }

  public Void doInBackground() {
      f.add(p);
      f.setSize(500,100);
      f.setVisible(true);
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      for(int i=0; i<101; i++) {
        if(isCancelled())
          return null;
        System.out.println(i);
        p.setValue(i);
        try{Thread.sleep(30);}catch(Exception e){}           
      }
      return null;
  }

}

答案 1 :(得分:0)

试试这个:通过创建一个对象来使用MyStringWorker类 例如:

MyStringWorker sw = new MystringWorker(args).execute();

在try block中使用:

sw.cancel(true)
  

参考更多:
  http://docs.oracle.com/javase/8/docs/api/javax/swing/SwingWorker.html#isCancelled--