【问题标题】:Pausing SwingWorker暂停 SwingWorker
【发布时间】:2013-12-04 14:42:13
【问题描述】:

我是 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;

}

}

【问题讨论】:

标签: java multithreading


【解决方案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;
}

【讨论】:

  • 我在 Thread.wait(1000); ?
  • 我还在“else if (E.getSource( ) == 暂停) { Worker.cancel(true)" 抱歉
  • 您需要将 Worker 存储在一个字段中。所以不是 Worker.cancel() 而是一个现场工作者。将其设置为您在单击运行按钮时创建的工作人员,然后在单击暂停按钮时执行 worker.cancel()。
猜你喜欢
  • 2013-04-23
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多