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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 叶征东 中级黑马   /  2012-8-3 16:00  /  2364 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

学到了守护线程,视频里,毕老师只将守护线程的作用说了下,应用只是一笔带过了。他说当A线程依赖于B线程,可将A线程设为守护线程,这样当B线程运算结束后,A线程就可以自动结束。只说了这么一句,有点抽象,有谁可以写个具体的实例么?谢谢。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
守护线程...
来个高手解释下,并来个应用场景!
详细加多分!
回复 使用道具 举报
本帖最后由 陈冲 于 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, 下载次数: 91)

运行结果

运行结果

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 王渠 于 2012-8-3 16:36 编辑

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


因为无论我们是否运行了垃圾回收器,他都是存在的。
并且从API文档中看到,它是一个单独的线程存在,虽然不知道它是否真的是守护线程,不过猜,也猜它是守护线程了。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王渠 发表于 2012-8-3 16:31
老师应该也说过吧,相对其他的线程,守护线程是后台线程,依赖于前台线程。
只有当前台线程全部运行结束后 ...

           谢谢。
回复 使用道具 举报
陈冲 发表于 2012-8-3 16:24
对Java程序来说,只要还有一个前台线程在运行,这个进程就不会结束;
而如果一个进程中只有后台线程在运行 ...

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