Java 在这种情况下,当我想阻止SwingWorker时,我做错了什么?
我试图用Tread编写相同的代码,但它也不起作用。点击停止按钮后的控制台输出: 真的 真的Java 在这种情况下,当我想阻止SwingWorker时,我做错了什么?,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,我试图用Tread编写相同的代码,但它也不起作用。点击停止按钮后的控制台输出: 真的 真的 所以,worker已经完成了,但程序仍然继续显示毫秒。什么是死后生活?如果使用相同的线程:方法isAlive()返回“false”。根据您的代码,看起来您需要一个带循环的辅助线程来保持运行,直到主线程告诉它停止运行,这是通过辅助线程完成的。取消(true)。问题是您正在取消它,但不做任何事情来通知循环本身停止迭代。要解决此问题,您应该更改 public class Form extends JPa
所以,worker已经完成了,但程序仍然继续显示毫秒。什么是死后生活?如果使用相同的线程:方法isAlive()返回“false”。根据您的代码,看起来您需要一个带循环的辅助线程来保持运行,直到主线程告诉它停止运行,这是通过
辅助线程完成的。取消(true)代码>。问题是您正在取消它,但不做任何事情来通知循环本身停止迭代。要解决此问题,您应该更改
public class Form extends JPanel{
private JButton startButton;
private JPanel rootPanel;
private JButton stopButton;
private JLabel screen;
private Worker worker;
public Form() {
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
worker = new Worker(screen);
worker.execute();
}
});
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
worker.cancel(true);
System.out.println(worker.isDone());
System.out.println(worker.isCancelled());
}
});
}
private void createUIComponents() {
rootPanel = this;
}
}
到
注意java文档中“isCancelled”的措辞:
isCancelled()
如果此任务在正常完成之前已取消,则返回true。
由于循环从未自行关闭,因此它将永远无法正常完成
根据您的代码,看起来您需要一个带循环的worker来保持运行,直到主线程告诉它停止运行,这是通过worker.cancel(true)完成的代码>。问题是您正在取消它,但不做任何事情来通知循环本身停止迭代。要解决此问题,您应该更改
public class Form extends JPanel{
private JButton startButton;
private JPanel rootPanel;
private JButton stopButton;
private JLabel screen;
private Worker worker;
public Form() {
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
worker = new Worker(screen);
worker.execute();
}
});
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
worker.cancel(true);
System.out.println(worker.isDone());
System.out.println(worker.isCancelled());
}
});
}
private void createUIComponents() {
rootPanel = this;
}
}
到
注意java文档中“isCancelled”的措辞:
isCancelled()
如果此任务在正常完成之前已取消,则返回true。
由于循环从未自行关闭,因此它将永远无法正常完成
循环从未终止,因此工作进程从未停止。SwingWorker应该调用isCancelled()方法来检测工作进程是否已取消,然后在doInBackground()方法中退出while循环。您的循环永远不会终止,因此工作进程永远不会停止。SwingWorker应该调用isCancelled()方法来检测工作进程是否已被取消,然后退出doInBackground()方法中的while循环,而不是(;;)
尝试while(!Thread.interrupted())
(发布方法不检查它)。
for (; ; ) {
publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}
while(!isCancelled()){
publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}