我有一个运行模拟的线程,正在迭代逻辑层中动态系统的一步,然后重新绘制GUI以在屏幕上查看结果。为了让用户查看系统如何变化,每次重绘之间都有一个休眠,但我还需要暂停模拟以观察变化,这是停止重新绘制和系统的迭代,直到用户恢复模拟。
目前看起来像这样:
simulationThread = new Thread(){
@Override
public void run(){
for(int i=0; i<iterations; i++){
world.iterate();
try{
Thread.sleep(100);
}catch( Exception e ){
e.printStackTrace();
}
view.repaint();
}
}
};
simulationThread.start();
如何暂停simulationThread并能够再次恢复?我尝试使用wait()方法,但是当线程处于休眠状态并且调用wait时会出现问题。我怀疑我应该改变线程如何等待下一次重绘以便完成暂停/恢复任务,但我不确定如何。
答案 0 :(得分:1)
class Pauser
{
public:
public synchronized void pause()
{
isPaused = true;
}
public synchronized void resume()
{
isPaused = false;
notifyAll();
}
public synchronized void waitIfPaused()
{
while(isPaused)
{
wait();
}
}
private:
boolean isPaused;
};
使用.pause()
方法进行暂停模拟,.resume()
表示恢复,并且只要可以安全暂停,就可以使用线程内的.waitIfPaused()
。例如,您可以在更改系统参数之前使用.waitIfPaused()
。