logo

Java デーモン スレッド

デーモン スレッドは、プログラムの実行終了時に JVM が終了するのを妨げない、優先度の低いバックグラウンド スレッドです。

  • デーモン スレッドはバックグラウンドで実行され、ユーザー スレッドをサポートします。
  • すべてのユーザー (非デーモン) スレッドが完了すると、JVM は自動的に終了します。
  • これらは同じ Thread クラスを使用して作成されますが、setDaemon(true) メソッドを使用してデーモンとしてマークされます。
  • setDaemon(true) メソッドは、スレッドが開始される前に呼び出す必要があります。
  • 一般的な例には、ガベージ コレクターやファイナライザー スレッドなどがあります。

構文

Java
thread.setDaemon(true); 

使用例

  1. ガベージコレクション: Java のガベージ コレクター (GC) はデーモン スレッドとして実行されます。
  2. バックグラウンド監視: デーモン スレッドは、アプリケーション コンポーネントのリソースまたは接続の状態を監視できます。
  3. ロギングおよび監査サービス: デーモン スレッドを使用すると、バックグラウンド アクティビティを継続的にログに記録できます。
  4. クリーンアップ操作: デーモン スレッドは、一時ファイルを定期的にクリアして未使用のリソースを解放したり、キャッシュのクリーンアップを実行したりすることがあります。
  5. スケジューラまたはタイマー タスク: バックグラウンド スケジューラは多くの場合、デーモン スレッドを使用して一定の間隔でタスクをトリガーします。

使用される方法

  • void setDaemon(boolean on): スレッドをデーモンまたはユーザー スレッドとしてマークします。 start() の前に呼び出す必要があります。
  • ブール値 isDaemon(): スレッドがデーモンかどうかを確認します。

デーモンスレッドの作成

Java
public 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... 

デーモンスレッドの動作

Java
public 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 が実行中でも終了する
メインスレッドワーカースレッドガベージコレクターのバックグラウンドモニター
クイズの作成