hq600 2016-09-12 16:31 采纳率: 0%
浏览 1095

java 后台线程中创建一个线程问题求解

今晚在看Think In Java的时候,看到后台线程这一小节,突然有个想法,如果在一个守护线程里面创建一个非守护线程(不显示的设置setDaemon(true)),那么创建的非守护线程是否也变成了守护线程。
代码如下
package com.hq.day0601;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**

  • 简单的后台线程(守护线程)练习,该练习主要演示的是后台线程在最后一个非后台线程结束后,也会被关闭
  • @author Administrator * */ public class SimpleDaemons implements Runnable {

@Override
public void run() {
try {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new TestThread());
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("SimpleDaemons is Daemons:"+Thread.currentThread().isDaemon());
System.out.println(Thread.currentThread() +" "+this );

} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("sleep() Interrupted");
}
}

public static void main(String[] args) throws Exception {
for(int i = 0 ; i < 3;i++){
Thread daemons = new Thread(new SimpleDaemons());
daemons.setDaemon(true);
daemons.start();
}
System.out.println("daemons start!");
TimeUnit.SECONDS.sleep(1);
}

}

/**

  • 校验守护线程中创建的线程是否是守护线程
  • @author Administrator * */ class TestThread implements Runnable { @Override public void run() { System.out.println("TestThread is Daemon:"+Thread.currentThread().isDaemon()); } }

打印结果:

从打印结果观察到,在后台线程中创建的线程不是后台线程。
然后,我对代码进行了改造,加上while循环
代码如下:
package com.hq.day0601;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**

  • 简单的后台线程(守护线程)练习,该练习主要演示的是后台线程在最后一个非后台线程结束后,也会被关闭
  • @author Administrator
    *
    */
    public class SimpleDaemons implements Runnable {

    @Override
    public void run() {

    try {
    ExecutorService exec = Executors.newCachedThreadPool();
    exec.execute(new TestThread());
    while(true){//添加while循环
    TimeUnit.MILLISECONDS.sleep(100);
    System.out.println("SimpleDaemons is Daemons:"+Thread.currentThread().isDaemon());
    System.out.println(Thread.currentThread() +" "+this );
    }
    } catch (InterruptedException e) {

    e.printStackTrace();
    System.out.println("sleep() Interrupted");
    }

    }

    public static void main(String[] args) throws Exception {
    for(int i = 0 ; i < 3;i++){
    Thread daemons = new Thread(new SimpleDaemons());
    daemons.setDaemon(true);
    daemons.start();
    }
    System.out.println("daemons start!");
    TimeUnit.SECONDS.sleep(1);
    }

}

/**

  • 校验守护线程中创建的线程是否是守护线程
  • @author Administrator * */ class TestThread implements Runnable { @Override public void run() { System.out.println("TestThread is Daemon:"+Thread.currentThread().isDaemon()); } } 我以为程序会在一秒后终止。但是却出了一个奇怪的现象,控制台一直在打印while循环里要打印的内容, 这让我感到非常费解,不知道有没有哪个大神讲解下这是什么原因。
  • 写回答

1条回答

  • qli 2016-09-12 20:06
    关注

    是你的Java VM中还有一个非daemon thread 还在运行

    评论

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝