如何使用JButtons启动和暂停SwingWorker线程

时间:2014-04-29 17:11:44

标签: java multithreading swing

我正在尝试学习Swing中的Threads。

我有一个带有JProgressBar(进度)的框架,五个JButton(开始,暂停,恢复,取消,关闭)和一个JLabel(label1)。

框架打开。仅启用启用。开始调用我的课程Progressor:

一次又一次更新

进步者进步者; //声明为类变量,在构造函数中初始化new,再次在重写done方法中

这是ButtonListener类:

public class ButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e)
    {

        if (e.getSource() == jbStart) {
            progressor.execute();
            label1.setText("Progressing ...");
            jbCancel.setEnabled(true);
            jbResume.setEnabled(true);
            jbSuspend.setEnabled(true);
            jbClose.setEnabled(true);
        }
        if(e.getSource() == jbCancel) {
            progressor.cancel(true);
            label1.setText("Progress Canceled");
        }
        if (e.getSource() == jbSuspend) {
            label1.setText(progressor.suspendProgress());
        }
        if (e.getSource() == jbResume) {
            label1.setText(progressor.resumeProgress());
        }
        if (e.getSource() == jbClose) {
            dispose();
        }

    }

} // buttonlistener

这是SwingWorker类:​​

public class Progressor extends SwingWorker<Void, Integer> {

    private volatile boolean suspend = false;
    private Object lock = new Object();

    @Override
    protected Void doInBackground() {

        for (int i = 0; i <= 10; i++) {
            checkForSuspend();
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
            }
            publish(i);
        }   
        return null;
    }

    @Override
    protected void process(List<Integer> list) {
        int value = list.get(list.size() - 1);
        progress.setValue(value);

    }

    public void checkForSuspend() {
        synchronized (lock) {
            while (suspend) {
                try {
                    lock.wait();
                } catch (InterruptedException ie){
                }
            }
        }
    }//checkForSuspend

    @Override
    protected void done() {
        label1.setText("All Done.  Press close to exit");
        progressor = new Progressor();
    }

    public synchronized String suspendProgress() {
        suspend = true;
        return "Progress suspended ...";
    }

    public synchronized String resumeProgress() {
        synchronized (lock) {
            suspend = false;
            lock.notify();
            return "Progress resumed ...";
        }
    }


}//Progressor class

一切正常,但cancel实际上并没有取消线程(进度条继续)。

我应该在取消前暂停吗?

2 个答案:

答案 0 :(得分:0)

How to Pause and Resume a Thread in Java from another Thread问题与您的问题非常相似,并且在答案中有一些很好的例子。

至于你自己的代码以及为什么它不起作用:

  1. 您可以在每次点击时创建新的进度。你应该使用并控制一个,而不是每次都创建新的。
  2. 暂停进度器时完成工作而不是暂停。正如上面的问题所述 - 您应该在计算的某些点上查看标志并对其进行操作。示例:

    while (!cancel) {
        if (!suspended) {
            for (int i = 1; i <= 10; i++) {
                    Thread.sleep(1000);
                    publish(i);
            }
        }
    }
    

    上面的代码将在下一次达到10时暂停(除非你在此之前恢复),并在按下取消时结束(取消需要以明显的方式添加为额外标志)。

答案 1 :(得分:0)

你的线程应该在while循环中运行,该循环查找一个布尔值来改变另一个对象的值,然后单击按钮时只需用setPause(true / false)更改状态:

while(true){
    if(object_everyone_can_reference.getPause()){
    Thread.sleep(1000);
     }

 }