停止/取消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)。