package chenwenbiao.test;
import java.io.IOException;
/*
* 守护线程在没有用户线程可服务时自动离开
* 在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。
* 这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。
* 将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。
* 典型的守护线程例子是JVM中的系统资源自动回收线程,
* 我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,
* 当我们的程序中不再有任何运行中的Thread,
* 程序就不会再产生垃圾,垃圾回收器也就无事可做,
* 所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。
* 它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
* 守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
* 也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。
* 那Java的守护线程是什么样子的呢。
* 当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;
* 如果还有一个或以上的非守护线程则JVM不会退出。
*/
public class testThread extends Thread {
public testThread() {
}
/** *//**
* 线程的run方法,它将和其他线程同时运行
*/
public void run(){
for(int i = 1; i <= 100; i++){
try{
Thread.sleep(100);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println(i);
}
}
public static void main(String [] args){
testThread test = new testThread();
test.setDaemon(true);
test.start();
/**
* 在start之后再设置为守护线程的话,就会抛出如下异常:
* Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.setDaemon(Unknown Source)
at chenwenbiao.test.testThread.main(testThread.java:42)
但线程是正常工作的,只是不是守护线程
*/
// test.setDaemon(true);
System.out.println("isDaemon = " + test.isDaemon());
try {
System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束,如果用户不输入东西,那么程序会一直从1输出到100,之后才算完了,但主进程还没结束;而当我们在运行这个程序时输入一个回车,那全部线程都结束了,包括主线程都退出
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
java设置守护线程。只要Thread.setDeamon(true)就可以了。只能在创建的时候设置!运行之后再setDeamon(true)则会报异常IllegalThreadStateException
不过一直没有了解守护线程和非守护线程有什么区别!一直属于烂(非滥)用- -
守护线程一听 就是“单相思”!~ 守护主线程! 主线程一旦退出,守护线程不管现在在做什么都要伴随着主线程的退出而退出。 就像以前皇帝一样,皇帝挂了,其他人都要陪葬!! 所以守护程序的退出,可能不是十分优美。因为守护线程可能执行了一半中途强行挂掉。
而非守护线程就不一样了!~主线程依赖于非守护线程。主线程不会主动强制退出,如果非守护线程还在运行中。(当然不包括线程显示的强制退出如:System.exit(0);这种情况属于程序被动退出)
当程序中只存在守护线程时,意味着JVM退出,即程序停止运行了。当且仅当有一个非守护线程,JVM就不会主动退出!
一旦,一个线程设置为守护线程之后, 其该线程创建的子线程也隐式的设置为守护线程
这是本人的一点理解,有疑义或者补充请提出!3Q~