我是GUI和多线程的初学者。我现在有一个模拟,它通过在控制台中移动的bug运行。我想用一个按钮来暂停这个错误。我有两个按钮(“运行”和“暂停”),“运行”按钮将启动模拟,“暂停”按钮应该暂停它(或者让它睡一会儿),我已经成功地使“运行”按钮正常工作,但是我无法在运行后单击“暂停”(因为它在同一个线程中,我相信)我已经读了很多,但似乎仍然无法解决它。任何帮助都会受到极大的感谢。//在我的行动听众中..。
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;
}}
发布于 2013-12-04 14:49:51
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;
}https://stackoverflow.com/questions/20378245
复制相似问题