【发布时间】:2019-03-19 18:00:10
【问题描述】:
public class Worker extends SwingWorker<Integer, String> {
private JLabel screen;
public Worker(JLabel screen) {
this.screen = screen;
}
@Override
protected Integer doInBackground() throws Exception {
for (; ; ) {
publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}
}
@Override
protected void process(List<String> chunks) {
screen.setText(chunks.get(0));
}
}
形式:
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;
}
}
我尝试用 Tread 编写相同的代码,但它也不起作用。点击stopButton后控制台输出:
是的
是的
所以,工人已经完成了,但程序仍然继续显示毫秒。什么是死后生活?在使用 Thread 相同的情况下:方法 isAlive() 返回“false”。
【问题讨论】:
-
您的循环永远不会终止,因此工作人员永远不会停止。代替
for( ; ; )试试while (!Thread.interrupted())(发布方法不检查) -
SwingWorker 应该调用 isCancelled() 方法来检测 worker 是否被取消,然后在 doInBackground() 方法中退出 while 循环。
标签: java multithreading swing swingworker