这是我的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;
}
}
答案 0 :(得分:4)
取消处理实际上是您的责任 - 这不是摆动工作者的固有属性。来自文档:"The task must cooperate with its own cancellation ...。有两种方法可以做到这一点:
对于您的问题,第二个显然适用。每次迭代,检查任务是否已被取消。如果是这样,请返回。在这段代码中,我已经将取消移动到主线程,因为告诉自己取消的任务没有那么多意义(只是返回),但是在工作线程中取消应该没问题。
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--