线程相关知识
守护线程,用户线程,主线程
- 用户线程和主线程都是非守护线程,主线程指:main方法运行的线程。
- 在创建一个线程的过程中如果设置了Thread.setDaemon(false),表示将此线程设置为用户线程,Thread.setDaemon(true),表示将此线程设置为守护线程。
- 守护线程的特点是:当主线程终止时,守护线程自动终止。
- 用户线程在主线程运行结束后,依然会继续运行,此时JVM不会终止。
- JVM会在主线程运行结束,切无用户线程的情况下,自动终止。
- 守护线程在主线程运行结束后,如果没有其他用户线程运行的情况下,会随JVM的终止而结束。
测试:
public class test {
public static void main(String[] args) throws IOException, InterruptedException {
System.out.println("主线程开始执行!");
Thread userThread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("用户线程------开始执行");
try {
while(true) {
Thread.sleep(1000);
System.out.println("用户线程-----正在执行");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("用户线程-----执行结束");
}
});
Thread daemonThread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("守护线程-----开始执行");
try {
while(true) {
Thread.sleep(1000);
System.out.println("守护线程-----正在执行");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("守护线程------执行结束");
}
});
daemonThread.setDaemon(true);
userThread.start();
daemonThread.start();
Thread.sleep(10000);
System.out.println("手动结束守护线程执行");
daemonThread.stop();
System.out.println("主线程------执行结束!");
}
}
上面的测试会发现:
- 当主线程执行结束后,用户线程和守护线程会继续执行
- 当主线程执行结束后,如果手动结束用户线程,守护线程也会结束执行
- 当主线程执行结束后,如果手动结束守护线程,用户线程会继续执行。
- 另外:在创建一个线程后,如果不设置 thread.setDaemon(true) 则这个线程是一个用户线程。