Java コードで定期的なチェックを行う必要があります。いくつかのことは別々のスレッドで実行され、そこでは 5 秒ごとにチェックする必要があり、次に 10 分ごとに他のことをチェックする必要があります。
これらの「タイマー」をJavaでどのように実装すればよいですか? ループしてから、スレッドをしばらくスリープ状態にする必要がありますか?
それを行う適切な方法は何ですか?
まさにそれを行うScheduledThreadPoolExecutor
classを使用する必要があります。
ExecutorService実装の ScheduledThreadPoolExecutorServiceの使用を検討する必要がある場合があります
javadocに従って:
指定された遅延後にコマンドを実行するか、定期的に実行するようにコマンドを追加でスケジュールできる ThreadPoolExecutor 。このクラスは、複数のワーカー スレッドが必要な場合、または ThreadPoolExecutor (このクラスが拡張する) の追加の柔軟性または機能が必要な場合に、Timer よりも適しています。
これを行うにはいくつかの方法があります。ScheduledExecutorServiceを使用します
ScheduledExecutorService scheduler = ...
final ScheduledFuture<?> fiveSecHandle =
scheduler.scheduleAtFixedRate(task5, 5, 5, SECONDS);
final ScheduledFuture<?> beeperHandle =
scheduler.scheduleAtFixedRate(task10, 10, 10, SECONDS);
scheduler.schedule(new Runnable() {
public void run() { beeperHandle.cancel(true); }
}, 60 * 60, SECONDS);
ほとんどの GUI フレームワークでは、すべての描画コマンドと GUI の変更をメイン スレッドでのみ発行する必要があるため、通常、タイマーは GUI フレームワークによって提供されます。同様の要件 (つまり、特定の条件下でのみ実行される特定のタスク) を持つ他の同様のフレームワークも、フレームワークによって課される制限と互換性のあるタイマーの実装を提供します。可能な限り、互換性が必要なフレームワークが提供するタイマーを使用してください。
それ以外の場合は、タイマーを実装する一般的な方法が少なくとも 2 つあります。1 つは次のイベントまでスリープするスレッドを使用する方法で、もう 1 つは GUI フレームワークでより一般的なイベント ループを使用する方法です。間隔の精度がそれほど重要ではない非常に長時間実行されるタスクの場合、別の一般的な方法は、cron (Unix および Unix 系システム) またはスケジュールされたタスク (Windows) またはアラーム インテント (Android) を使用することです。
それを行う適切な方法は何ですか?
具体的な方法について他の人が言ったことは無視してください。時間の適切な方法は、何をしようとしているのかによって異なります。短い間隔または長い間隔が必要な場合、非常に正確なタイミングが必要な場合、または少し遅いイベントや早いイベントが必要な場合、バッテリー/CPU の節約を気にする必要がある場合、固定の開始間隔または固定の終了が必要な場合-開始間隔、タスクがすぐに終了するか、終了するまでに時間がかかるかどうか、前のタスクが開始する前に別のタスクを開始できるようにするかどうか、永続性が必要かどうか (つまり、タスクを続行できるようにするかどうか)システムの再起動またはプロセスの強制終了後のタイマー)。これらはすべて、使用するのに最適なタイマーに影響します。
アプリケーションが非常に大きく、負荷分散サーバーも使用している場合は、時間管理アクティビティ用に Quartz スケジューラーを試すことができます。