Java 如何重新启动应用程序的更新循环

Java 如何重新启动应用程序的更新循环,java,swing,game-loop,Java,Swing,Game Loop,我正在使用Java和Swing开发一个绘图应用程序。它有一个不断运行的常量更新循环,只要布尔变量设置为true。循环位于线程内部 它工作得很好,但现在我希望循环仅在按下鼠标的特定时间运行,否则不会运行。这样就不会白白浪费记忆 要停止循环,我可以简单地将该变量设置为false。但我的问题是,在停止循环后如何重新启动它?将该变量设置回true将不会重新启动循环。这样做的好方法是什么 编辑:我的一个小小的简化循环: public void run(){ int TICKS_PER_SECON

我正在使用Java和Swing开发一个绘图应用程序。它有一个不断运行的常量更新循环,只要布尔变量设置为true。循环位于线程内部

它工作得很好,但现在我希望循环仅在按下鼠标的特定时间运行,否则不会运行。这样就不会白白浪费记忆

要停止循环,我可以简单地将该变量设置为false。但我的问题是,在停止循环后如何重新启动它?将该变量设置回true将不会重新启动循环。这样做的好方法是什么

编辑:我的一个小小的简化循环:

public void run(){

    int TICKS_PER_SECOND = 50;
    int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
    int MAX_FRAMESKIP = 10;

    long next_game_tick = System.currentTimeMillis();
    int loops;

    boolean app_is_running = true;

    while( app_is_running ) {

        loops = 0;
        while( System.currentTimeMillis() > next_game_tick && loops < MAX_FRAMESKIP) {

            update();

            next_game_tick += SKIP_TICKS;
            loops++;
        }

        repaint();
    }

}

要在可由外部定义的布尔值控制的情况下,每帧执行一次线程体,run方法的结构如下:

public void run()
{
    long delay;
    long frameStart = System.currentTimeMillis();

    // INSERT YOUR INITIALIZATION CODE HERE

    try
    {
        while (true)
        {
            if (active)  // Boolean defined outside of thread
            {
                // INSERT YOUR LOOP CODE HERE
            }

            frameStart += FRAME_RATE;
            delay = frameStart - System.currentTimeMillis();
            if (delay > 0)
            {
                Thread.sleep(delay);
            }
        }
    }
    catch (InterruptedException exception) {}
}
此外,如果希望消除大部分非活动线程持续运行循环的轻微开销,则while循环中的布尔值可以替换为信号量对象:


要在外部停止循环,请使用semaphore.acquire;要重新启动它,请使用semaphore.release。

使用Object.wait在线程未运行时挂起线程。有另一个线程调用对象。通知将其从睡眠中唤醒。

@peeskillet当然,请参阅我的edit@peeskillet是的,但据我所知,有时停止一个线程是一个问题,启动它相对困难,当然很容易。但从理论上讲,你是建议我在暂停循环时停止线程,在想重新启动循环时启动线程?请检查这个可能的副本
while (true)
{
    semaphore.acquire();  // Semaphore defined outside thread with 1 permit

    // INSERT YOUR LOOP CODE HERE 

    semaphore.release();

    frameStart += FRAME_RATE;
    delay = frameStart - System.currentTimeMillis();
    if (delay > 0)
    {
        Thread.sleep(delay);
    }
}