在 Java 中运行代码 x 秒?

2022-09-01 06:30:24

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

有没有更好的方法?


答案 1

这个设计取决于你想在15秒内做什么。两种最合理的情况是“每X做一次15秒”或“等待X发生或15秒,以较早者为准”,这将导致非常不同的代码。

只是等待

螺纹睡眠(15000)

这不会迭代,但是如果你想在15秒内什么都不做,效率要高得多(它浪费更少的CPU来无所事事)。

重复一些代码15秒

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

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

等待15秒或其他条件

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


答案 2

正如其他海报已经提到的,如果您只想让线程暂停一段时间,请使用 。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 { /* .. */ }
}

并从主线程中,执行以下操作:

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

/* when you want to stop it */
foo.kill();
thread.interrupt();

推荐