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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class ThreadDemo04_setDaemon {
public static void main(String[] args) {
        setDaemonThread s1=new setDaemonThread();
        setDaemonThread s2=new setDaemonThread();
        s1.setName("张飞");
        s2.setName("关羽");
        s1.setDaemon(true);
        s2.setDaemon(true);
        //我把张飞,关羽定义为用户线程或者守护线程
        //直接刘备活着的时候  他们两个才能或者
        //也有一定的延迟
        //就像坦克大战里面,基地是刘备,刘备死了一会,张飞,关羽也会死。
        s1.start();
        s2.start();
        Thread.currentThread().setName("刘备");
        //这里 是指当前线程 即这个main也是一个线程 。
        for(int x=0;x<5;x++){
                System.out.println(Thread.currentThread().getName()+x);
        }
       
}
}
问题:
这里我用到了线程类的标记用户线程的方法。setDaemon,我把s1 s2标记为用户线程


这里 main方法 也是一个线程。
应该是抢占式的调用CPU,当main方法里面运行结束后
其他线程也会结束。结果应该是刘备,关羽,张飞交错出现。

但是我输出来结果却只有main方法里面的输出
刘备0
刘备1
刘备2
刘备3
刘备4

是为什么呢?

5 个回复

倒序浏览
把你这个类setDaemonThread也贴出来看看,估计是这个类的run方法已经运行完了,所以在循环之前你的两个线程已经结束了
回复 使用道具 举报
15614014298 发表于 2016-4-12 19:55
把你这个类setDaemonThread也贴出来看看,估计是这个类的run方法已经运行完了,所以在循环之前你的两个线程 ...

public class setDaemonThread extends Thread{
        public void run() {
                for(int x=0;x<100;x++){
                        System.out.println(getName()+x+new Date());
                       
        }
}
}
你好 setDaemonThread
回复 使用道具 举报
setDaemon必须在线程开始的时候设置,所以你的setName应该写在setDaemon方法下面
回复 使用道具 举报
我也遇到了这个问题同问
回复 使用道具 举报
同问啊  !!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马