首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >暂停SwingWorker

暂停SwingWorker
EN

Stack Overflow用户
提问于 2013-12-04 14:42:13
回答 1查看 3.4K关注 0票数 2

我是GUI和多线程的初学者。我现在有一个模拟,它通过在控制台中移动的bug运行。我想用一个按钮来暂停这个错误。我有两个按钮(“运行”和“暂停”),“运行”按钮将启动模拟,“暂停”按钮应该暂停它(或者让它睡一会儿),我已经成功地使“运行”按钮正常工作,但是我无法在运行后单击“暂停”(因为它在同一个线程中,我相信)我已经读了很多,但似乎仍然无法解决它。任何帮助都会受到极大的感谢。//在我的行动听众中..。

代码语言:javascript
复制
else if (E.getSource() == Pause) {
        Worker pauseWorker = new Worker();
        pauseWorker.execute();

在我的新工人班

代码语言:javascript
复制
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;

}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-04 14:49:51

代码语言:javascript
复制
else if (E.getSource() == Pause) {
    Worker pauseWorker = new Worker();
    pauseWorker.execute();

这将启动一个新的工作人员,不停止运行一个。

相反,您可以保留对后台工作人员的引用,并在按下“暂停”按钮时对其进行cancel()。请参阅SwingWorker.cancel()

代码语言:javascript
复制
else if (E.getSource() == Pause) {
    worker.cancel(true);
}

在工人班,定期检查你是否被取消了:

代码语言:javascript
复制
@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()方法,并自己进行管理。

为了给你一些想法,像这样的东西进入了工人类,然后:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20378245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档