我是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;
}
}
答案 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;
}