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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 郑彬 于 2012-8-16 23:51 编辑

当所有的前台线程结束后,所有的后台线程(守护线程)会自动结束。
这句话怎么理解?

点评

呵呵,还是记雅典娜和七个小矮人的例子吧,经典!  发表于 2012-8-16 20:01

评分

参与人数 1黑马币 +15 收起 理由
田建 + 15 加油!

查看全部评分

5 个回复

倒序浏览
/*
* 运行一下代码,你会发现,当把thread1设置为守护线程的时候,只要thread的for循环执行完成之后
* thread1的相关for循环就不会执行了(但是还没有执行完)。这就是守护线程的执行路程。
* 当程序中的所有用户线程都已结束运行时,即使守护线程run()中还有需要执行的语句,守护线程也不会再执行了
* 可以用守护线程做一些不是很严格的工作,即使随时结束不会产生不良的结果
* **/
class Daemon implements Runnable {
@Override
public void run() {
  if (Thread.currentThread().getName().equals("非守护线程")) {
   for (int i = 0; i < 15; i++) {
    System.out.println(Thread.currentThread().getName() + i);
    try {
     Thread.sleep(500);
    } catch (InterruptedException e) {
    }
   }
  }
  if (Thread.currentThread().getName().equals("守护线程")) {
   // int x =1;
   for (int i = 0; i < 1500; i++) {
    System.out.println(Thread.currentThread().getName() + i);
    try {
     Thread.sleep(500);
    } catch (InterruptedException e) {
    }
   }
  }
}
}
public class ExampleDaemon {
public static void main(String args[]) {
  Daemon daemon = new Daemon();
  Thread thread = new Thread(daemon, "非守护线程");
  Thread thread1 = new Thread(daemon, "守护线程");
  thread1.setDaemon(true);// 设置为守护线程
  thread.start();
  thread1.start();
}
}

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
就是后台线程依赖于前台线程而存在,比如这里有两个线程,线程A和线程B,我们把线程B设为守护线程,当线程A运行结束后,线程B就马上自动结束,这就相当于这就像汽车没汽油了,汽车会自动停止一样~~(个人理解)

评分

参与人数 1黑马币 +15 收起 理由
田建 + 15 支持个人理解!

查看全部评分

回复 使用道具 举报
这个问题之前论坛中有童鞋已经回答过了,陈冲童鞋,之前我自己也不是太明白,看了他举得例子,很经典。
http://bbs.itheima.com/thread-21348-1-1.html
我自己再仿写一个

  1. class Daemon implements Runnable {
  2.         @Override
  3.         public void run() {
  4.                 int i = 0;
  5.                 while(true){
  6.                         System.out.println("I am a Daemon Thread!"+(i++));
  7.                 }
  8.         }
  9. }
  10. public class DaemonDemo {
  11.         public static void main(String[] args) {
  12.                 Daemon d = new Daemon();
  13.                 Thread t = new Thread(d);
  14.                 for(int i =0;i<15;i++){
  15.                         System.out.println("前台线程001");
  16.                 }
  17.                 //设置t为守护线程
  18.                 t.setDaemon(true);
  19.                 t.start();
  20.                 for(int i =0;i<15;i++){
  21.                         System.out.println("前台线程002");
  22.                 }
  23.         }
  24. }
复制代码
虽然我们定义了一个线程t是无限循环,但是把它设置为守护线程后,运行情况就会有变化,如果前台线程就是那两个for(){} over后,整个程序就结束,而不是无限循环。
这就是守护线程。
注意事项,直接看API:
setDaemon
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。 该方法首先调用该线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。
参数:
on - 如果为 true,则将该线程标记为守护线程。
回复 使用道具 举报
前台线程:是指接受后台线程服务的线程
后台线程:指为其他线程提供服务的线程
使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。
主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。
回复 使用道具 举报
问题已经解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马