1. 序章

Javaプログラムでは、操作に遅延または一時停止を追加することが比較的一般的です。 これは、タスクのペーシングや、別のタスクが完了するまで実行を一時停止する場合に役立ちます。

このチュートリアルでは、Javaで遅延を実装する2つの方法について説明します。

2. スレッドベースのアプローチ

Javaプログラムを実行すると、ホストマシンで実行されるプロセスが生成されます。 このプロセスには、プログラムが実行される少なくとも1つのスレッド(メインスレッド)が含まれています。 さらに、Javaはマルチスレッドを有効にします。これにより、アプリケーションはメインスレッドに対して並列または非同期で実行される新しいスレッドを作成できます。

2.1. Thread.sleepを使用する

Javaで一時停止するための迅速で汚い方法は、現在のスレッドに指定された時間スリープするように指示することです。 これは、 Thread.sleep(milliseconds)を使用して実行できます。

try {
    Thread.sleep(secondsToSleep * 1000);
} catch (InterruptedException ie) {
    Thread.currentThread().interrupt();
}

別のスレッドがスリープ中のスレッドに割り込む場合に備えて、sleepメソッドをtry / catchブロックでラップすることをお勧めします。この場合、 InterruptedException をキャッチし、現在のスレッドに明示的に割り込みます。 、後でキャッチして処理できるようにします。 これはマルチスレッドプログラムではより重要ですが、後で他のスレッドを追加する場合に備えて、シングルスレッドプログラムでも良い習慣です。

2.2. TimeUnit.sleepを使用する

読みやすくするために、TimeUnit.XXX.sleep(y)を使用できます。ここで、XXXはスリープする時間の単位(SECONDS、MINUTESなど)であり、yはスリープするユニットの数です。[ X174X]これは舞台裏でThread.sleepを使用します。 TimeUnit構文の例を次に示します。

try {
    TimeUnit.SECONDS.sleep(secondsToSleep);
} catch (InterruptedException ie) {
    Thread.currentThread().interrupt();
}

ただし、これらのスレッドベースの方法を使用することにはいくつかの欠点があります

  • 特にミリ秒やナノ秒などの小さな時間増分を使用する場合、スリープ時間は正確ではありません。
  • ループ内で使用すると、他のコード実行のためにループの反復間でスリープがわずかにドリフトするため、多くの反復後に実行時間が不正確になる可能性があります

3. ExecutorServiceベースのアプローチ

Javaは、 ScheduledExecutorService インターフェースを提供します。これは、より堅牢で正確なソリューションです。 このインターフェイスは、指定された遅延の後、または一定の時間間隔で1回実行されるようにコードをスケジュールできます。

遅延後にコードを1回実行するには、スケジュールメソッドを使用できます。

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);

Classname :: someTask の部分は、遅延後に実行されるメソッドを指定する場所です。

  • someTask は、実行するメソッドの名前です
  • Classname は、someTaskメソッドを含むクラスの名前です。

一定の時間間隔でタスクを実行するには、scheduleAtFixedRateメソッドを使用できます。

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);

これにより、 someTask メソッドが繰り返し呼び出され、各呼び出しの間にdelayInSecondsが一時停止します。

より多くのタイミングオプションを許可することに加えて、 ScheduledExecutorService メソッドは、ドリフトの問題を防ぐため、より正確な時間間隔を生成します。

4. 結論

この記事では、Javaプログラムで遅延を作成するための2つの方法について説明しました。

この記事の完全なコードは、Githubにあります。 これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。