关于java:如何在一段时间后退出while循环?

How to exit a while loop after a certain time?

我有一个while循环,我希望它在经过一段时间后退出。

例如:

1
2
3
while(condition and 10 sec has not passed){

}


1
2
3
4
5
long startTime = System.currentTimeMillis(); //fetch starting time
while(false||(System.currentTimeMillis()-startTime)<10000)
{
    // do something
}

因此声明

1
(System.currentTimeMillis()-startTime)<10000

检查自循环开始以来是否为10秒或10,000毫秒。

编辑

正如@Julien所指出的,如果你在while循环中的代码块需要花费很多时间,这可能会失败。因此使用ExecutorService将是一个不错的选择。

首先,我们必须实现Runnable

1
2
3
4
5
6
class MyTask implements Runnable
{
    public void run() {
        // add your code here
    }
}

然后我们可以像这样使用ExecutorService,

1
2
3
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(new MyTask()), 10, TimeUnit.SECONDS); // Timeout of 10 seconds.
executor.shutdown();


建议和接受的解决方案不会成功。

它不会在10秒后停止循环。想象一下,循环中的代码需要20秒才能处理,并在9.9秒时调用。您的代码将在执行29.9秒后退出。

如果你想在10秒后完全停止,你必须在一个外部线程中执行你的代码,你将在一定的超时后杀死它。

已经在这里和那里提出了现有的解决方案


就像是:

1
2
3
4
5
6
7
long start_time = System.currentTimeMillis();
long wait_time = 10000;
long end_time = start_time + wait_time;

while (System.currentTimeMillis() < end_time) {
   //..
}

应该做的伎俩。如果您还需要其他条件,则只需将它们添加到while语句中即可。


不要使用它

1
System.currentTimeMillis()-startTime

它可能导致挂机主机时间变化。
更好地使用这种方式:

1
2
3
4
5
6
7
8
Integer i = 0;
            try {
                while (condition && i++ < 100) {
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

(100 * 100 = 10秒超时)