こんにちは 私は、規定された時間(例えば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. VB.NETで任意のコードブロックを実行できますか?
- 3. Razorでコードブロックの実行を強制する方法
- 4. コードブロック、単一プロジェクト、多くの実行可能ファイル
- 5. コードブロック全体をステップ実行する方法は?
- 6. 任意のコードブロックを実行させるC#ツールはありますか?
- 7. コードブロックのデバッグ
- 8. perlコードブロック
- 9. コードブロックは実行されませんが、関数は定義されます
- 10. GCDを使ってバックグラウンドでコードブロックを定期的に実行できますか?
- 11. Linqクエリ内でコードブロックを実行する構文はありますか?
- 12. MVCコードブロック内のカミソリブラケット
- 13. ASP.NETコードブロックはSite.master
- 14. Org-modeコードブロック評価
- 15. aspxコードブロック対runatサーバ
- 16. 解決コードブロックを(C#の)
- 17. DokuWiki:コードブロック内のハイライト部分?
- 18. このコードは、このコードをコードブロックで完全に実行されているが、ideone.com
- 19. このコードブロックは理解できません(条件なしで実行します)
- 20. eslintでコードブロックを区切る改行を適用する
- 21. <% %>(埋め込みコードブロック)
- 22. ラッパーは、例えば、コードブロック
- 23. 括弧のないif節の複数行コードブロックの奇妙な動作
- 24. 複数行のテキストボックス - 「コードブロックはこのコンテキストではサポートされていません」
- 25. マークダウンの複数行のコードブロックが不要なタブを追加する
- 26. MVC 3ビュー内のコードブロックの整列
- 27. vimでのPythonコードブロックの強調
- 28. 異なるスレッド間のコードブロックのシリアル化
- 29. コードブロックでのglibcの静的リンク
- 30. sqlplus実行ステートメントの実行
何が渡された時の合意量の後に起こるだろうか?タイムアウト? –