在Java中运行x秒的代码?

Dan*_*ing 25 java time while-loop

我想写一个java while循环,它将迭代15秒.我认为这样做的一种方法是存储当前系统时间+ 15秒,然后将其与while循环签名中的当前时间进行比较.

有没有更好的办法?

Nic*_*cue 55

这个设计取决于你想要做什么15s.两个最合理的案例是"每15秒做一次这样的事情"或"等待X发生或15秒即将到来",这将导致非常不同的代码.

等待

了Thread.sleep(15000)

这不会迭代,但是如果你想为15s做任何事情都会更有效率(它什么都不做会浪费更少的CPU).

重复一些代码15秒

如果你真的想要循环15秒,那么你的解决方案就可以了,只要你的代码不需要太长时间.就像是:

long t= System.currentTimeMillis();
long end = t+15000;
while(System.currentTimeMillis() < end) {
  // do something
  // pause to avoid churning
  Thread.sleep( xxx );
}
Run Code Online (Sandbox Code Playgroud)

等待15秒或其他一些条件

如果你希望你的代码在15秒之后被中断,无论它做什么,你都需要一个多线程的解决方案.查看java.util.concurrent以获取许多有用的对象.大多数锁定的方法(如wait())都有一个超时参数.一个信号可能做的正是你所需要的.

  • 他很可能希望线程在 15 秒内做某事,所以睡觉会适得其反。 (2认同)

Bin*_*mas 5

正如其他海报已经提到的,如果您只想让线程暂停一段时间,请使用Thread.sleep().

如果你想让线程做一些事情,但想让它在一段时间后停止,使用类似的东西:

class Foo implements Runnable {
    private volatile boolean killed = false;

    public void run() {
        while (!killed) {
            try { doOnce(); } catch (InterruptedException ex) { killed = true; }
        }
    }

    public void kill() { killed = true; }
    private void doOnce() throws InterruptedException { /* .. */ }
}
Run Code Online (Sandbox Code Playgroud)

并从主线程,执行:

Foo foo = new Foo(); 
Thread thread = new Thread(foo);
thread.start();

/* when you want to stop it */
foo.kill();
thread.interrupt();
Run Code Online (Sandbox Code Playgroud)


Rob*_*tie 5

尽管您可能想看看当前时间是否大于您想要停止的点,但您的一般方法似乎不错,否则,您可能会运行很长时间。

另一种方法是运行一个计时器/线程,在 15 秒过去后设置一个标志。该标志必须标记为易失性,否则您的循环可能看不到值中发生的更改。

如果您关心效率,那么选择哪个更昂贵,每个循环获取一次系统时间还是访问易失性变量?我不知道哪一个更有效——如果它真的很重要,你可以对其进行基准测试。

对于简单、可维护的代码,我会选择计时器检查方法:

long endTime = System.currentTimeMillis() + 15000
while (System.currentTimeMillis() < endTime) {
  //loop
} 
Run Code Online (Sandbox Code Playgroud)