こんにちは 私は、規定された時間(例えばxミリ秒)実行するコードブロック(関数の特定の行)が必要です。これは可能ですJava?java-timingコードブロックの実行
答えて
第一のアプローチ:
long startTime = System.nanoTime();
while(System.nanoTime() - startTime < MAX_TIME_IN_NANOSECONDS){
// your code ...
}
第二のアプローチ
スレッドでコードを起動し。
あなたが必要とする限り、メインスレッドをスリープします。
スレッドを強制停止(中断)します。
現在のタイムスタンプに基づく終了条件を使用するか、別のスレッドを作成して、指定したタイムアウト後に強制終了します。
+1。コード自体が現在の時刻を確認するために定期的に停止するか、別のスレッドが時刻を監視して何らかのkillシグナルを送信する必要があります。 –
-1私たちはもうスレッドをkillしません。 –
はい、ありがとうございます。どちらの方法でも、スレッドは最も確実に停止可能に設計できます。 –
あなたはカレンダーを使用することができます。
timeInMilis = Calendar.getInstance().getTimeInMillis();
while(Calendar.getInstance().getTimeInMilis() - timeInMilis < MAX_TIME_IN_MILIS){
// Execute block
}
ワウありがとう!!! –
System.currentTimeMillis()
を使用して時刻を確認し、時間が経過した後にループを抜けます。
long endTime = System.currentTimeMillis() + ClassName.EXECUTION_TIME_MS; while (System.currentTimeMillis() < endTime) { // do your stuff }
あなたが、何らかの理由でスレッド内で眠る終了時に終了するあなたの睡眠時間を調整する必要がある場合。あなたはwait()
とnotify()
方法を使用するつもりなら
long timeLeft = endTime - System.currentTimeMillis(); if (sleepAmount > timeLeft) sleepAmount = timeLeft; Thread.sleep(sleepAmount);
は、その後、最大待機時間を確保するためにwait()
に引数として計算timeLeft
を使用しています。待ち時間が訪れると、メソッドが戻り、ループが壊れます。
long timeLeft = endTime - System.currentTimeMillis(); if (timeLeft > 0) this.wait(timeLeft);
あなたは時間がかかることがありますループ内の複数のステップを実行している場合は、プロセスはステップ間で分割する場合は、あなたが指定した時間あればループを終了するには、手順の間に追加のチェックを追加する必要があります通過しました。これは設計上の決定です。タイマーが期限切れになったら、タスクが作業中のステップを完了して終了するようにしますか?望ましい結果に基づいてコーディングする方法は、あなた次第です。
long endTime = System.currentTimeMillis() + ClassName.EXECUTION_TIME_MS; while (System.currentTimeMillis() < endTime) { this.doFirstLongThing(); if (System.currentTimeMillis() >= endTime) break; this.doSecondLongThing(); if (System.currentTimeMillis() >= endTime) break; this.doThirdLongThing(); }
メソッドを別のスレッドで実行しますが、エグゼキュータに渡します。その後、Future
を使用して、スレッドが完了するまで一定の時間待機することができます。完了しないと、TimeoutExceptionが発生し、スレッドをキャンセルできます。スレッドをキャンセルすると、スレッドが中断されます。したがって、コードはスレッドの中断されたステータスを定期的にチェックし、必要に応じて終了する必要があります。例えば
:
ExecutorService exec = Executors.newSingleThreadExecutor();
Future<Integer> future = exec.submit(new Callable<Integer>(){
@Override
public Integer call() throws Exception {
//do some stuff
//periodically check if this thread has been interrupted
if (Thread.currentThread().isInterrupted()) {
return -1;
}
//do some more stuff
//check if interrupted
if (Thread.currentThread().isInterrupted()) {
return -1;
}
//... and so on
return 0;
}
});
exec.shutdown();
try {
//wait 5 seconds for the task to complete.
future.get(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
//the task did not complete in 5 seconds
e.printStackTrace();
System.out.println("CANCELLING");
//cancel it
future.cancel(true); //sends interrupt
}
- 1. コードブロックの実行時エラーが
- 2. orgモードでJavaコードブロックを実行
- 3. nodejsでn秒間コードブロックを実行
- 4. 別のコードブロックが実行された後にのみコードブロックを実行する方法
- 5. Igniteキャッシュ内の各項目のコロケーションされたコードブロックの実行
- 6. アンドロイドのリリースモードでのみコードブロックを実行する方法
- 7. 余分なコードブロックを実行する - スコープ - 実行を遅くする?
- 8. VB.NETで任意のコードブロックを実行できますか?
- 9. どのコードブロックが高速に実行されますか?
- 10. Razorでコードブロックの実行を強制する方法
- 11. コードブロック、単一プロジェクト、多くの実行可能ファイル
- 12. ASP.NETで埋め込みコードブロックの実行を避ける
- 13. コードブロック全体をステップ実行する方法は?
- 14. ユニットテスト中に実行するコードブロックを避けてください。
- 15. 強制終了時にコードブロックを実行しますか?
- 16. コードブロックが一緒に実行されている場合
- 17. untilループ内でコードブロックを実行するRobot Framework
- 18. コードブロックとコードブロックの選択
- 19. は、コードブロックで行列演算Cプログラムを実行できません。
- 20. SQLの実行時にBashの `<< -EOSQL`コードブロックとは何ですか?
- 21. このコードブロックが実行されないのはなぜですか?
- 22. SpyderのようにPyCharmのコードブロックだけを実行するには?
- 23. 操作方法コンソールをクリアして、インタラクティブなストーリーシナリオで特定のコードブロックを実行
- 24. forループで "else"コードブロックが実行されるのはなぜですか?
- 25. 前のコードブロックが成功した場合にシェフレシピコードを実行する
- 26. DropWizardタイマーを使用してコードブロックの実行時間を調べる
- 27. 任意のコードブロックを実行させるC#ツールはありますか?
- 28. コードブロックにより、スクリプトは実行されませんが、対話的に実行されます
- 29. コードブロックのインデントエラー?
- 30. コードブロックのデバッグ
何が渡された時の合意量の後に起こるだろうか?タイムアウト? –