デーモン スレッドは、プログラムの実行終了時に JVM が終了するのを妨げない、優先度の低いバックグラウンド スレッドです。
- デーモン スレッドはバックグラウンドで実行され、ユーザー スレッドをサポートします。
- すべてのユーザー (非デーモン) スレッドが完了すると、JVM は自動的に終了します。
- これらは同じ Thread クラスを使用して作成されますが、setDaemon(true) メソッドを使用してデーモンとしてマークされます。
- setDaemon(true) メソッドは、スレッドが開始される前に呼び出す必要があります。
- 一般的な例には、ガベージ コレクターやファイナライザー スレッドなどがあります。
構文
Javathread.setDaemon(true);
使用例
- ガベージコレクション: Java のガベージ コレクター (GC) はデーモン スレッドとして実行されます。
- バックグラウンド監視: デーモン スレッドは、アプリケーション コンポーネントのリソースまたは接続の状態を監視できます。
- ロギングおよび監査サービス: デーモン スレッドを使用すると、バックグラウンド アクティビティを継続的にログに記録できます。
- クリーンアップ操作: デーモン スレッドは、一時ファイルを定期的にクリアして未使用のリソースを解放したり、キャッシュのクリーンアップを実行したりすることがあります。
- スケジューラまたはタイマー タスク: バックグラウンド スケジューラは多くの場合、デーモン スレッドを使用して一定の間隔でタスクをトリガーします。
使用される方法
- void setDaemon(boolean on): スレッドをデーモンまたはユーザー スレッドとしてマークします。 start() の前に呼び出す必要があります。
- ブール値 isDaemon(): スレッドがデーモンかどうかを確認します。
デーモンスレッドの作成
Javapublic class DaemonExample extends Thread { public void run() { if (Thread.currentThread().isDaemon()) { System.out.println('Daemon thread running...'); } else { System.out.println('User thread running...'); } } public static void main(String[] args) { DaemonExample t1 = new DaemonExample(); DaemonExample t2 = new DaemonExample(); t1.setDaemon(true); // must be set before start() t1.start(); t2.start(); } }
出力
Daemon thread running... User thread running...
デーモンスレッドの動作
Javapublic class DaemonBehavior extends Thread { public void run() { while (true) { System.out.println('Daemon thread running...'); } } public static void main(String[] args) { DaemonBehavior t = new DaemonBehavior(); t.setDaemon(true); t.start(); System.out.println('Main (user) thread ends...'); } }
出力
Main (user) thread ends...
デーモン スレッドがまだ実行中であっても、JVM はメイン スレッドの終了直後に終了します。
重要な注意事項
- スレッドは、それを作成したスレッドのデーモンステータスを継承します。
- start() の後に呼び出された場合、setDaemon(true) メソッドは IllegalThreadStateException をスローします。
- デーモン スレッドは、ファイルへの書き込みやデータベースの更新など、完了が必要なタスクには使用しないでください。
- JVM は、クリーンアップ操作を実行せずに、すべてのデーモン スレッドを突然終了します。
ユーザースレッドとデーモンスレッドの違い
| 基礎 | ユーザースレッド | デーモンスレッド |
|---|---|---|
| 目的 | アプリケーションの主要なタスクを実行します | バックグラウンドサービスを実行します |
| ライフサイクル | 終了するまでJVMを存続させます | すべてのユーザースレッドが終了すると終了します |
| 優先度 | 通常はもっと高い | 通常は低い |
| JVM終了 | JVM は完了を待ちます | JVM が実行中でも終了する |
| 例 | メインスレッドワーカースレッド | ガベージコレクターのバックグラウンドモニター |