java守护线程与用户线程的区别

来源:互联网 发布:kontakt mac 音源 编辑:程序博客网 时间:2024/05/01 10:28
class Thread1 extends Thread {    public void run(){         for(int i = 1; i <= 15;i++){             try{                 Thread.sleep(100);              } catch (InterruptedException ex){                 ex.printStackTrace();             }             System.out.println("子线程 "+i);         }     } }public class DaemonThread {public static void main(String[] args) {Thread1 t = new Thread1();t.setDaemon(true);//是精灵守护线程,此设置必须在start之前设置t.start();System.out.println((t.isDaemon()==true?"子线程是精灵守护线程":"子线程不是精灵守护线程"));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"结束");}}

执行上面代码,输出结果为:

子线程是精灵守护线程
子线程 1
子线程 2
子线程 3
子线程 4
子线程 5
子线程 6
子线程 7
子线程 8
子线程 9
main结束

class Thread2 extends Thread {    public void run(){         for(int i = 1; i <= 15;i++){             try{                 Thread.sleep(100);              } catch (InterruptedException ex){                 ex.printStackTrace();             }             System.out.println("子线程 "+i);         }     } }public class DaemonThread2 {public static void main(String[] args) {Thread2 t = new Thread2();t.setDaemon(false);//不是精灵守护线程t.start();System.out.println((t.isDaemon()==true?"子线程是精灵守护线程":"子线程不是精灵守护线程"));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"结束");}}
执行上面代码,输出结果为:

子线程不是精灵守护线程
子线程 1
子线程 2
子线程 3
子线程 4
子线程 5
子线程 6
子线程 7
子线程 8
子线程 9
main结束
子线程 10
子线程 11
子线程 12
子线程 13
子线程 14
子线程 15

由此可见,当线程为守护线程时,主线程结束,守护线程立即结束,然而,当线程为用户线程时,主线程结束后,非守护线程还会接着执行,直到执行完毕。

设置守护线程通过thread.setDeamon(boolean)设置,但是设置必须在thread.start()之前,否则会跑出一个IllegalThreadStateException异常

使用守护线程是需要主要的地方是:JRE判断程序是否执行结束的标准是所有的用户线程行完毕了,而不管守护线程的状态,因此,在使用守护线程候一定要注意这个问题

但是daemon Thread实际应用在那里呢?举个例子,web服务器中的Servlet,容器启动时后台初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。


参考:http://www.cnblogs.com/super-d2/p/3348183.html



原创粉丝点击