20

while ループがあり、時間が経過したら終了させたい。

例えば:

while(condition and 10 sec has not passed){

}
4

5 に答える 5

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

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

(System.currentTimeMillis()-startTime)<10000

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

編集

@Julien が指摘したように、while ループ内のコード ブロックに多くの時間がかかる場合、これは失敗する可能性があります

まず、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();
于 2013-11-01T12:56:48.877 に答える
15

提案され、承認された解決策ではうまくいきません。

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

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

既存のソリューションはすでにあちこちで提案されています

于 2013-11-01T13:33:50.977 に答える
10

何かのようなもの:

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

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

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

于 2013-11-01T12:56:26.130 に答える
0

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

System.currentTimeMillis()-startTime

ホスト マシンの時刻の変更でハングが発生する可能性があります。このように使用することをお勧めします:

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

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

于 2016-03-09T12:55:02.780 に答える