Dan*_*ing 25 java time while-loop
我想写一个java while循环,它将迭代15秒.我认为这样做的一种方法是存储当前系统时间+ 15秒,然后将其与while循环签名中的当前时间进行比较.
有没有更好的办法?
Nic*_*cue 55
这个设计取决于你想要做什么15s.两个最合理的案例是"每15秒做一次这样的事情"或"等待X发生或15秒即将到来",这将导致非常不同的代码.
这不会迭代,但是如果你想为15s做任何事情都会更有效率(它什么都不做会浪费更少的CPU).
如果你真的想要循环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秒之后被中断,无论它做什么,你都需要一个多线程的解决方案.查看java.util.concurrent以获取许多有用的对象.大多数锁定的方法(如wait())都有一个超时参数.一个信号可能做的正是你所需要的.
正如其他海报已经提到的,如果您只想让线程暂停一段时间,请使用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)
尽管您可能想看看当前时间是否大于您想要停止的点,但您的一般方法似乎不错,否则,您可能会运行很长时间。
另一种方法是运行一个计时器/线程,在 15 秒过去后设置一个标志。该标志必须标记为易失性,否则您的循环可能看不到值中发生的更改。
如果您关心效率,那么选择哪个更昂贵,每个循环获取一次系统时间还是访问易失性变量?我不知道哪一个更有效——如果它真的很重要,你可以对其进行基准测试。
对于简单、可维护的代码,我会选择计时器检查方法:
long endTime = System.currentTimeMillis() + 15000
while (System.currentTimeMillis() < endTime) {
//loop
}
Run Code Online (Sandbox Code Playgroud)