web-dev-qa-db-ja.com

特定の時間後にwhileループを終了する方法は?

Whileループがあり、しばらくしてから終了させたい。

例えば:

while(condition and 10 sec has not passed){

}
14
Roland
long startTime = System.currentTimeMillis(); //fetch starting time
while(false||(System.currentTimeMillis()-startTime)<10000)
{
    // do something
}

したがって、ステートメント

(System.currentTimeMillis()-startTime)<10000

ループが開始されてから10秒または10,000ミリ秒であったかどうかを確認します。

[〜#〜] edit [〜#〜]

@Julienが指摘したように、whileループ内のコードブロックに多くの時間がかかる場合、これは失敗する可能性があります。したがって、 ExecutorService を使用するのが適切なオプションです。

最初にRunnableを実装する必要があります

class MyTask implements Runnable
{
    public void run() { 
        // add your code here
    }
}

その後、ExecutorServiceを次のように使用できます。

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(new MyTask()), 10, TimeUnit.SECONDS); // Timeout of 10 seconds.
executor.shutdown();
28
Ankit Rustagi

提案され、受け入れられているソリューションは、トリックを行いません。

10秒後にループを停止しません。ループ内のコードの処理に20秒かかり、9.9秒で呼び出されるとします。コードは29.9秒の実行後に終了します。

10秒後に正確に停止する場合は、特定のタイムアウト後に強制終了する外部スレッドでコードを実行する必要があります。

既存のソリューションはすでに提案されています here および there

11
Julien

何かのようなもの:

long start_time = System.currentTimeMillis();
long wait_time = 10000;
long end_time = start_time + wait_time;

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

トリックを行う必要があります。他の条件も必要な場合は、whileステートメントに追加するだけです。

7
Choc13

これを使用しないでください

System.currentTimeMillis()-startTime

ホストマシンの時間変更でハングする可能性があります。この方法をよりよく使用します。

Integer i = 0;
            try {
                while (condition && i++ < 100) {
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

(100 * 100 = 10秒のタイムアウト)

0
delfer