いわゆるデーモンスレッドとは、プログラムの実行時にバックグラウンドで一般的なサービスを提供するスレッドを指し、このスレッドはプログラムの必須部分ではありません。したがって、すべての非バックグラウンドスレッドが終了すると、プログラムは終了し、プロセス内のすべての非バックグラウンドスレッドが強制終了されます。たとえば、main()の実行は非バックグラウンドスレッドです。
スレッドは、setDaemon()メソッドによってスレッドが開始される前に、バックグラウンドスレッドとして設定できます。
カスタマイズされたThreadFactoryを作成することにより、Excecutorによって作成されたスレッドの属性(背景、優先度、名前)をカスタマイズできます。
class DaemonThreadFactory implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
// TODO Auto-generated method stub
Thread t=new Thread(r);
t.setDaemon(true);
return t;
}
}
public class DaemonFromFactory implements Runnable{
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ExecutorService exec=Executors.newCachedThreadPool(new DaemonThreadFactory());
for(int i=0;i<10;i++) {
exec.execute(new DaemonFromFactory());
}
System.out.println("All daemons started");
TimeUnit.MILLISECONDS.sleep(500);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try{
TimeUnit.MILLISECONDS.sleep(100);
System.out.println(Thread.currentThread()+" "+this);
}catch(InterruptedException e) {
System.out.println("Interrupted");
}
}
}
}
その中で、main()を実行する非バックグラウンドスレッドがスリープするため、バックグラウンドスレッドの起動の効果がウィンドウに表示されます。main()を実行する非バックグラウンドスレッドがスリープを許可されていない場合、バックグラウンドスレッドの作成の効果のみが表示されます。 。main()を長時間実行する非バックグラウンドスレッドのスリープ時間を調整すると、バックグラウンドスレッドの実行トラックが長くなります。スリープ時間を十分に短く調整すると、バックグラウンドスレッドは表示されません。実行トラック。
isDaemon()メソッドを呼び出すことにより、スレッドがバックグラウンドスレッドであるかどうかを判別できます。
バックグラウンドスレッドの場合、作成するすべてのスレッドが自動的にバックグラウンドスレッドとして設定されます。