2016-11-28 651 views
0

如何在执行方法时暂停。在执行Java中的方法时暂停x秒

private void myMethod() { 
    // some lines of code 
    this.player.activateEffect(true); 
    // pause for 5 seconds 
    this.player.activateEffect(false); 
} 

我希望该方法将激活5秒的方法称为activeEfect。

+0

如果这是一个线性控制台程序或线程不是问题,'Thread.sleep' * *可以工作。但是,如果此代码是事件驱动GUI的一部分,如Swing或JavaFX程序,那么可以很容易地冻结整个程序,通过使用Thread.sleep来使其无响应,而不必关心其调用哪个线程。您可能想要提供有关程序结构的更多信息。 –

+0

检查了这个http://stackoverflow.com/a/24104427/6689101 – zombie

回答

1

下面是代码睡眠:

try { 
    Thread.sleep(5000L); 
} catch(InterruptedException ie) { 
} 
+3

Thread.sleep将阻止线程,如果它在UI线程上运行,那么应用程序将冻结 – zombie

+0

作品在我的情况下,非常感谢。 – t4dohx

+0

有没有人知道为什么程序“冻结”了一段时间从另一种方法调用?如果我直接从实例接口调用方法,它不会冻结并且工作正常。 – t4dohx

0

最好的办法是进行在myMethod的你的行动()然后调用其他方法,大概一个Runnable 5秒后。

private void myMethod() { 
    // some lines of code 
    this.player.activateEffect(true); 

    // run afterDelay in 5 seconds 
    postDelayed(afterDelay, 5000); 
} 

private Runnable afterDelay = new Runnable() { 
    @Override 
    public void run() { 
     player.activateEffect(false); 
    } 
}; 

此代码来自我自己的Android Java经验,但我认为这种技术是可移植的。

+0

不,我认为这个例子仅适用于Android,因为它看起来是Android特定处理程序类的一部分。 –

1

在状态改变方法中等待的整个想法是有缺陷的。等待延迟整个线程,阻止任何工作完成。

如果碰巧是UI控制线程,应用程序会冻结。

你真正想要做的是给“效果”一个超时值,并且每个(游戏)“打勾”检查超时是否已经过期,并在过期时将其删除。