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