停止/取消SwingWorker线程?

我正试图找出如何在按下按钮时停止运行SwingWorker线程。 我一直在四处寻找,我在解决如何做到这一点时遇到了一些麻烦。 目前这就是我所拥有的:

new MySwingWorkerClass(args).execute(); 

我正在创建一个按钮,我想用它来停止线程:

 button = new JButton("Stop"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Stop the swing worker thread } }); 

我已经环顾四周寻找答案,到目前为止我已经设法找到了取消方法。 我不明白如何使用它来阻止我的摇摆工作者。 我尝试了以下但它不起作用:

 SwingWorker.cancel(true); 

您需要保留对SwingWorker的引用 ,然后使用该引用取消工作线程。

 MySwingWorker myWorker = new MySwingWorkerClass(args).execute(); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Stop the swing worker thread myWorker.cancel(true); } }); 

这是一个完整的例子:

在此处输入图像描述

 public class WorkerDemo extends JFrame { private boolean isStarted = false; private JLabel counterLabel = new JLabel("Not started"); private Worker worker = new Worker(); private JButton startButton = new JButton(new AbstractAction("Start") { @Override public void actionPerformed(ActionEvent arg0) { if(!isStarted) { worker.execute(); isStarted = false; } } }); private JButton stopButton = new JButton(new AbstractAction("Stop") { @Override public void actionPerformed(ActionEvent arg0) { worker.cancel(true); } }); public WorkerDemo() { add(startButton, BorderLayout.WEST); add(counterLabel, BorderLayout.CENTER); add(stopButton, BorderLayout.EAST); pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } class Worker extends SwingWorker { int counter = 0; @Override protected Void doInBackground() throws Exception { while(true) { counter++; publish(counter); Thread.sleep(60); } } @Override protected void process(List chunk) { // get last result Integer counterChunk = chunk.get(chunk.size()-1); counterLabel.setText(counterChunk.toString()); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new WorkerDemo(); } }); } } 

您需要定期检查其取消的标志(即isCancelled() )。 SwingWorker留下了如何处理中断的方法。

有关更多信息,请参阅取消后台任务 。

您可以尝试重写done()方法并将其放在try catch中并捕获java.util.concurrent.CancellationException。 就像是

。 。 。

 @Overide done() { try { get(); } catch (CancellationException e) { // Do your task after cancellation } } 

。 。 。

我想你必须在每次停止后重启计数器。

对于startButton,您必须重新启动worker,如同

 private JButton startButton = new JButton(new AbstractAction("Start") { @Override public void actionPerformed(ActionEvent arg0) { if(!isStarted) { worker = new Worker(); // New line worker.execute(); isStarted = false; } } }); 

停止你可以使用

 worker.setStopFlag(); // in stopButton actionPerformed block. 

在Worker类中,private boolean stopFlag = false;

并添加

 if( stopFlag) break; 

在Thread.sleep(60)之后; 最后在worker类的末尾为setFlag设置了set

 void setStopFlag(){ stopFlag = true; } 

顺便说一句,如果你想要exception退出,你可以使用cancel(true)。