黑马程序员技术交流社区

标题: 关于守护线程的 [打印本页]

作者: 叶征东    时间: 2012-8-3 16:00
标题: 关于守护线程的
学到了守护线程,视频里,毕老师只将守护线程的作用说了下,应用只是一笔带过了。他说当A线程依赖于B线程,可将A线程设为守护线程,这样当B线程运算结束后,A线程就可以自动结束。只说了这么一句,有点抽象,有谁可以写个具体的实例么?谢谢。
作者: 张_涛    时间: 2012-8-3 16:04
守护线程...
来个高手解释下,并来个应用场景!
详细加多分!
作者: 陈冲    时间: 2012-8-3 16:24
本帖最后由 陈冲 于 2012-8-3 17:04 编辑

对Java程序来说,只要还有一个前台线程在运行,这个进程就不会结束;
而如果一个进程中只有后台线程在运行,这个进程就会结束。
如果某个线程在启动(调用start方法)之前调用了setDaemon(true)方法,
这个线程就变成了后台线程。
  1. public class setDaemon {
  2.     public static void main(String[] args) {
  3.         ThreadTest t = new ThreadTest();
  4.         Thread tt = new Thread(t);
  5.         tt.setDaemon(true);
  6.         tt.start();

  7.         /*try {//为了保证有显示结果,在此处使用sleep()方法
  8.             Thread.sleep(10);
  9.         } catch (Exception e) {}*/
  10.     }

  11. }

  12. class ThreadTest implements Runnable {
  13.     public void run() {
  14.         int count=0;
  15.         while (true) {//这是个无限循环的方法
  16.             System.out.println(Thread.currentThread().getName() + " is running"+count);
  17.             count++;
  18.             
  19.         }
  20.     }
  21. }
复制代码
从程序和运行结果图中可以看出:虽然创建了一个无限循环的线程,但因为它是后台线程(调用了setDaemon(true)方法),
所以整个进程在主线程结束时就随之终止运行了,而不是无限执行。

如果运行没有结果,那纯粹是计算机的配置太好,main线程结束得太快……可以在tt.start()语句后添加sleep()语句,用以延迟主函数的结束时间。

未命名.jpg (33.85 KB, 下载次数: 125)

运行结果

运行结果

作者: 王渠    时间: 2012-8-3 16:31
本帖最后由 王渠 于 2012-8-3 16:36 编辑

老师应该也说过吧,相对其他的线程,守护线程是后台线程,依赖于前台线程。
只有当前台线程全部运行结束后才会结束。
到不是如你所说的A依赖于B,B结束了,A就结束了。
而是该程序所有的线程结束了,被定义为守护线程的线程才结束。
实际例子不知道是否正确:
也就是垃圾回收器。System.gc();
这个东西就是一个线程,它实际是Runtime类下面的方法。
创建的垃圾回收机,调用的是本地的方法,也就是系统的功能,而觉得这个线程就是一个守护线程。
因为无论你是否有定义这个线程,每次运行程序,jvm都会去回收不用的对象,相信也就是用的该方法。


因为无论我们是否运行了垃圾回收器,他都是存在的。
并且从API文档中看到,它是一个单独的线程存在,虽然不知道它是否真的是守护线程,不过猜,也猜它是守护线程了。
作者: 叶征东    时间: 2012-8-3 17:40
王渠 发表于 2012-8-3 16:31
老师应该也说过吧,相对其他的线程,守护线程是后台线程,依赖于前台线程。
只有当前台线程全部运行结束后 ...

           谢谢。
作者: 叶征东    时间: 2012-8-3 17:41
陈冲 发表于 2012-8-3 16:24
对Java程序来说,只要还有一个前台线程在运行,这个进程就不会结束;
而如果一个进程中只有后台线程在运行 ...

              
谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2