暂停SwingWorker

时间:2013-12-04 14:42:14

标签: java multithreading

我是GUI和多线程的初学者。我目前有一个模拟,它运行在控制台中移动的错误。我希望能够使用按钮暂停错误。我有两个按钮(运行和暂停)运行按钮将启动模拟,暂停按钮应暂停它(或让它睡一会儿)我设法让运行按钮工作但我无法点击暂停一旦它运行(因为它在我相信的同一个线程中)我已经读了很多但似乎仍然无法解决它...任何帮助都将受到大力赞赏.. //在我的行动听众中......

else if (E.getSource() == Pause) {
        Worker pauseWorker = new Worker();
        pauseWorker.execute();

在我的新工人阶级

import javax.swing.SwingWorker;

   public class Worker extends SwingWorker<Void, Void> {

@Override
protected Void doInBackground() throws Exception {
    // System.out.println("Background");
    for (int i = 0; i <= 1; i++) {
        Thread.sleep(1000);
        System.out.println("Background running");
    }

    return null;

}

}

1 个答案:

答案 0 :(得分:1)

else if (E.getSource() == Pause) {
    Worker pauseWorker = new Worker();
    pauseWorker.execute();

这会启动一个新工人,但不会停止正在运行的工人。

相反,您可以在按下暂停按钮时保留对后台工作程序的引用和cancel()。见SwingWorker.cancel()

else if (E.getSource() == Pause) {
    worker.cancel(true);
}

在工人阶级,定期检查你是否被取消:

@Override
protected Void doInBackground() throws Exception {
    // System.out.println("Background");
    while(!isCancelled()) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            System.out.println("Background interrupted");
        }
        System.out.println("Background running");
    }
    return null;
}

如果您确实需要暂停而不是取消工作人员,则必须编写自己的pause()方法并自行管理。

为了给你一些想法,这样的事情会进入工人阶层:

boolean paused = false;

public void pause() {
    paused = true;
}

public synchronized void resume() {
    paused = false;
    this.notify();
}

@Override
protected Void doInBackground() throws Exception {
    while(!isCancelled()) {
        if( paused ) {
            System.out.println("Background paused, waiting for resume");
            try {
                synchronized(this){
                    wait(1000);
                }
            } catch (InterruptedException ex) {
                System.out.println("Background interrupted");
            }
        } else {
            System.out.println("Background running");
            // do a chunk of actual work
        }
    }
    return null;
}