在Java中执行方法时暂停执行x秒

在Java中执行方法时暂停执行x秒,java,methods,pause,Java,Methods,Pause,在执行方法时,如何暂停应用程序 考虑下面的例子: private void myMethod() { // some lines of code this.player.activateEffect(true); // pause for 5 seconds this.player.activateEffect(false); } 我想让activeEffect方法激活5秒钟,使用暂停。以下是代码: 以下是代码: 最好是在myMethod()中执行操作,然后在5秒钟后调

在执行方法时,如何暂停应用程序

考虑下面的例子:

private void myMethod() {
   // some lines of code
   this.player.activateEffect(true);
   // pause for 5 seconds
   this.player.activateEffect(false);
}
我想让
activeEffect
方法激活5秒钟,使用暂停。

以下是代码:

以下是代码:


最好是在myMethod()中执行操作,然后在5秒钟后调用另一个方法,可能是Runnable

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的经验,但我认为这项技术是可移植的。

你最好在myMethod()中执行你的操作,然后在5秒钟后调用另一个方法,可能是Runnable

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的经验,但我认为这项技术是可移植的。

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

如果恰好是UI控制线程,则应用程序将冻结


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

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

如果恰好是UI控制线程,则应用程序将冻结


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

Thread.sleep将阻止线程,如果它在UI线程上运行,那么应用程序将冻结有人知道程序“冻结”的原因吗当从另一个方法调用时,在一定的时间内?如果我直接从实例接口调用该方法,它不会冻结并且工作得很好。顺便说一句,我编写了一个名为MgntUtils的开源Java库,其中有一个带有方法sleepFor(Long,TimeUnit)的TimeUtils类。在它的内部是“吞咽”异常,因此您必须执行以下操作,而不是上面的代码:TimeUtils.sleepFor(5L,TimeUnit.SECONDS);在内部,它的功能与答案中的代码大致相同,但它更紧凑。这是一篇文章的链接,解释了库中有哪些实用程序以及从何处获取它(可以使用JAR、源代码和java文档)Thread.sleep将阻止线程,如果它在UI线程上运行,那么应用程序将冻结有人知道程序“冻结”的原因吗当从另一个方法调用时,在一定的时间内?如果我直接从实例接口调用该方法,它不会冻结并且工作得很好。顺便说一句,我编写了一个名为MgntUtils的开源Java库,其中有一个带有方法sleepFor(Long,TimeUnit)的TimeUtils类。在它的内部是“吞咽”异常,因此您必须执行以下操作,而不是上面的代码:TimeUtils.sleepFor(5L,TimeUnit.SECONDS);在内部,它的功能与答案中的代码大致相同,但它更紧凑。这是一篇文章的链接,解释了库中有哪些实用程序以及从何处获取(可以使用工作JAR、源代码和java文档)
Thread。如果这是一个线性控制台程序,或者线程不是问题,那么sleep
可以工作。但是,如果此代码是事件驱动GUI(如Swing或JavaFX程序)的一部分,则很容易冻结整个程序,通过使用
Thread.sleep
使其无响应,而不管调用哪个线程。您可能希望提供有关程序结构的更多信息。请查看
Thread。如果这是一个线性控制台程序或线程不是问题的程序,则sleep
可以工作。但是,如果此代码是事件驱动GUI(如Swing或JavaFX程序)的一部分,则很容易冻结整个程序,通过使用
Thread.sleep
使其无响应,而不管调用哪个线程。你可能想提供更多关于你的程序结构的信息。看看这个。不,我认为这个例子只适用于Android,因为它看起来是Android特定处理程序类的一部分。不,我认为这个例子只适用于Android,因为它看起来是Android特定处理程序类的一部分。