gpt4 book ai didi

java - SwingWorker.cancel(真);在java中不工作

转载 作者:行者123 更新时间:2023-11-29 03:18:11 25 4
gpt4 key购买 nike

这是我的 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;
}

}

最佳答案

处理取消实际上是你的责任——它不是 swingworker 的固有属性。来自文档:"The task must cooperate with its own cancellation ... .有两种方法可以做到这一点:

  • 在收到中断时终止。此过程在并发中断中进行了描述。
  • 通过以较短的时间间隔调用 SwingWorker.isCancelled。如果已为此 SwingWorker 调用取消,则此方法返回 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;
}

}

关于java - SwingWorker.cancel(真);在java中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25256027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com