今晚在看Think In Java的时候,看到后台线程这一小节,突然有个想法,如果在一个守护线程里面创建一个非守护线程(不显示的设置setDaemon(true)),那么创建的非守护线程是否也变成了守护线程。
代码如下
package com.hq.day0601;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
@Override
public void run() {
try {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new TestThread());
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("SimpleDaemons is Daemons:"+Thread.currentThread().isDaemon());
System.out.println(Thread.currentThread() +" "+this );
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("sleep() Interrupted");
}
}
public static void main(String[] args) throws Exception {
for(int i = 0 ; i < 3;i++){
Thread daemons = new Thread(new SimpleDaemons());
daemons.setDaemon(true);
daemons.start();
}
System.out.println("daemons start!");
TimeUnit.SECONDS.sleep(1);
}
}
/**
打印结果:
从打印结果观察到,在后台线程中创建的线程不是后台线程。
然后,我对代码进行了改造,加上while循环
代码如下:
package com.hq.day0601;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
@author Administrator
*
*/
public class SimpleDaemons implements Runnable {
@Override
public void run() {
try {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new TestThread());
while(true){//添加while循环
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("SimpleDaemons is Daemons:"+Thread.currentThread().isDaemon());
System.out.println(Thread.currentThread() +" "+this );
}
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("sleep() Interrupted");
}
}
public static void main(String[] args) throws Exception {
for(int i = 0 ; i < 3;i++){
Thread daemons = new Thread(new SimpleDaemons());
daemons.setDaemon(true);
daemons.start();
}
System.out.println("daemons start!");
TimeUnit.SECONDS.sleep(1);
}
}
/**
是你的Java VM中还有一个非daemon thread 还在运行