源代码如下:
package com.bjsxt.Thread;
/**
* 守护线程类
*/
class Daemon implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+", i="+i);
try {
// Thread.sleep(2000);
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class UsersThread implements Runnable{
@Override
public void run() {
Thread t = new Thread(new Daemon(),"Daemon");
//将该线程设置为守护线程
t.setDaemon(true);
t.start();
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+", i="+i+", t.isAlive(): " + t.isAlive()+ ", t.getState: "+t.getState());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class DaemonThreadDemo {
public static void main(String[] args)throws Exception {
Thread t = new Thread(new UsersThread(),"UsersThread");
t.start();
Thread.sleep(1000);
System.out.println(" 主线程结束 ");
}
}
运行结果如下:
Daemon, i=0
UsersThread, i=0, t.isAlive(): true, t.getState: RUNNABLE
Daemon, i=1
Daemon, i=2
Daemon, i=3
Daemon, i=4
主线程结束
UsersThread, i=1, t.isAlive(): true, t.getState: TIMED_WAITING
Daemon, i=5
Daemon, i=6
Daemon, i=7
Daemon, i=8
Daemon, i=9
UsersThread, i=2, t.isAlive(): true, t.getState: TIMED_WAITING
UsersThread, i=3, t.isAlive(): false, t.getState: TERMINATED
UsersThread, i=4, t.isAlive(): false, t.getState: TERMINATED
Process finished with exit code 0
疑问:
按照代码, Daemon线程 应该是 UsersThread线程 的守护线程。最后两行的打印结果显示,UsersThread线程 还在运行时, Daemon线程 已经结束了。
不应该是用户线程执行完,守护线程才随之死亡了,上述代码好像是守护线程先死亡,用户线程再死亡呢?