暂停和恢复正在休眠Java的线程

时间:2015-06-21 23:09:06

标签: java multithreading user-interface concurrency simulation

我有一个运行模拟的线程,正在迭代逻辑层中动态系统的一步,然后重新绘制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时会出现问题。我怀疑我应该改变线程如何等待下一次重绘以便完成暂停/恢复任务,但我不确定如何。

1 个答案:

答案 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()