A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© superob123 中级黑马   /  2014-6-6 15:42  /  1641 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

可不可以举个应用的例子来加深理解

2 个回复

倒序浏览
守护线程就是后台运行的,它依赖于前台运行的,
classTest {

public  static void main(String[] args) {               

Thread t1 = new MyCommon();               

Thread t2 = new Thread(new MyDaemon());               

t2.setDaemon(true);        //设置为守护线程   一定要设置在开启线程之前!!!!!!            

t2.start();               

t1.start();         } }如果前台挂了,守护线程自动结束。这个在毕向东java12天的第9到10天,建议你看一下,老师说的很明白,下面的代码就不写了就是创建线程的代码了,你应该会的,,,嘻嘻嘻共同进步

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
首先明白知识点:

Java有两种Thread:“守护线程Daemon”与“用户线程User”。
守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。
从字面上我们很容易将守护线程理解成是由虚拟机(virtual machine)在内部创建的,而用户线程则是自己所创建的。事实并不是这样,任何线程都可以是“守护线程Daemon”或“用户线程User”。他们在几乎每个方面都是相同的,唯一的区别是判断虚拟机何时离开:
用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。isDaemon方法将测试该线程是否为守护线程。
  这里有几点需要注意:
    (1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。  
    (2) 在Daemon线程中产生的新线程也是Daemon的。  
    (3) 不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑。

然后讲示例:

下面代码,我标记注释处的两个地方,  
第一种情况:

当我把那两行注释掉时,运行程序程序无法结束,要用Ctrl+c才能终止

这种情况下,主程序已经运行完了,可以看到结果over打印出来了,但是线程并没有结束!所以整个程序还在运行,需要强制结束!

第二种情况:

当我把那两行代码取消注释,运行程序,发现程序自己就能结束了。

为什么?
因为把t1,t2设置成守护线程了!设置成守护线程,在主方法运行结束后(主方法就是用户线程,用户线程又叫非守护线程!),除了守护线程没有任何线程还在运行了,守护线程没有服务的对象,作为一个守护线程此时会自己结束。看上面的知识点说(如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。),


  1. class StopThread implements Runnable
  2. {
  3.     private boolean flag =true;
  4.     public synchronized void run()
  5.     {
  6.         while(flag)
  7.         {
  8.             try
  9.             {
  10.                 wait();
  11.             }
  12.             catch (Exception e)
  13.             {
  14.                 System.out.println(Thread.currentThread().getName()+"....Exception");
  15.             }
  16.             
  17.             System.out.println(Thread.currentThread().getName()+"....run");
  18.         }
  19.     }
  20.     public void changeFlag()
  21.     {
  22.         flag = false;
  23.     }
  24. }
  25. class  StopThreadDemo
  26. {
  27.     public static void main(String[] args)
  28.     {
  29.         StopThread st = new StopThread();
  30.         
  31.         Thread t1 = new Thread(st);
  32.         Thread t2 = new Thread(st);
  33.         t1.setDaemon(true);                                         //注释处!!!
  34.         t2.setDaemon(true);                                         //注释处!!!
  35.         t1.start();
  36.         t2.start();
  37.         int num = 0;
  38.         while(true)
  39.         {
  40.             if(num++ == 60)
  41.             {
  42.                 break;
  43.             }
  44.             System.out.println(Thread.currentThread().getName()+"......."+num);
  45.         }
  46.         System.out.println("over");
  47.     }
  48. }
复制代码




评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马