Javaのデーモンスレッド
1. 概要
この短い記事では、Javaのデーモンスレッドを見て、それらを何に使用できるかを確認します。 また、デーモンスレッドとユーザースレッドの違いについても説明します。
2. デーモンスレッドとユーザースレッドの違い
Javaには、ユーザースレッドとデーモンスレッドの2種類のスレッドがあります。
ユーザースレッドは優先度の高いスレッドです。 The JVM will wait for any user thread to complete its task before terminating it.
一方、daemon threads are low-priority threads whose only role is to provide services to user threads.
デーモンスレッドはユーザースレッドにサービスを提供することを目的としており、ユーザースレッドの実行中にのみ必要になるため、すべてのユーザースレッドの実行が終了した後、JVMの終了を妨げることはありません。
そのため、デーモンスレッドに通常存在する無限ループは問題を引き起こしません。これは、すべてのユーザースレッドが実行を終了すると、finallyブロックを含むコードが実行されないためです。 このため、daemon threads are not recommended for I/O tasks.
ただし、このルールには例外があります。 デーモンスレッドの設計が不十分なコードは、JVMの終了を妨げる可能性があります。 たとえば、実行中のデーモンスレッドでThread.join()を呼び出すと、アプリケーションのシャットダウンをブロックできます。
3. デーモンスレッドの使用
デーモンスレッドは、ガベージコレクション、未使用オブジェクトのメモリの解放、キャッシュからの不要なエントリの削除などのバックグラウンドサポートタスクに役立ちます。 JVMスレッドのほとんどはデーモンスレッドです。
4. デーモンスレッドの作成
スレッドをデーモンスレッドに設定するには、Thread.setDaemon().を呼び出すだけです。この例では、Threadクラスを拡張するNewThreadクラスを使用します。
NewThread daemonThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();
Any thread inherits the daemon status of the thread that created it.メインスレッドはユーザースレッドであるため、mainメソッド内で作成されるスレッドは、デフォルトでユーザースレッドです。
メソッドsetDaemon()は、Threadオブジェクトが作成され、スレッドが開始されていない場合にのみ呼び出すことができます。 スレッドの実行中にsetDaemon()を呼び出そうとすると、IllegalThreadStateExceptionがスローされます。
@Test(expected = IllegalThreadStateException.class)
public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() {
NewThread daemonThread = new NewThread();
daemonThread.start();
daemonThread.setDaemon(true);
}
5. スレッドがデーモンスレッドであるかどうかの確認
最後に、スレッドがデーモンスレッドであるかどうかを確認するには、メソッドisDaemon()を呼び出すだけです。
@Test
public void whenCallIsDaemon_thenCorrect() {
NewThread daemonThread = new NewThread();
NewThread userThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();
userThread.start();
assertTrue(daemonThread.isDaemon());
assertFalse(userThread.isDaemon());
}
6. 結論
このクイックチュートリアルでは、デーモンスレッドとは何か、およびいくつかの実際的なシナリオでそれらを使用できることを確認しました。
いつものように、コードのフルバージョンはover on GitHubで利用できます。