【Java】デーモンスレッド (Daemon Thread)

はじめに

スレッドには、以下の2種類ある。

1) デーモンスレッド ★今回、扱う事項★
2) ユーザスレッド ... デフォルト
API仕様
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Thread.html

デーモンスレッドとは?

 * プログラム終了のタイミングで、スレッド処理が破棄される

利点

 * 終了処理(後処理)を意識しないですむ

使用上の注意

 * スレッド内で、後処理が必要な処理(リソース破棄 (データベース接続、一時ファイルなど) 
   を行う場合、使用を控える

作成方法

Thread thread = new Thread();
thread.setDaemon(true); // ★setDaemonにtrueをセット★
thread.start();

※ setDaemon()は、start()より先に呼ばないとダメらしい
http://hiratara.hatenadiary.jp/entry/20060725/1153838234

実験

(i) ユーザスレッドの場合

public class Main {

  public static void main(String[] args) {
    Thread thread = new Thread(() -> {
      for (int i = 0; i < 10; i++) {
        try {
          Thread.sleep(10L);
        } catch (InterruptedException ex) {
          ex.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName());
      }
    });
    //thread.setDaemon(true); // ★ユーザスレッド★
    thread.start();

    System.out.println("Done : " + thread.isAlive());
  }
}
出力結果 (スレッドが実行「Thread-0」されている)
Done : true
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0

(ii) デーモンスレッドの場合

・・・
thread.setDaemon(true); // ★デーモンスレッド(上記のサンプルのコメントを外した)★
・・・
出力結果 (スレッドが実行されない)
Done : true