黑马程序员技术交流社区

标题: 在学习线程的时候碰到的一个问题~ [打印本页]

作者: 这个名字也有宇    时间: 2016-4-12 18:51
标题: 在学习线程的时候碰到的一个问题~
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

是为什么呢?


作者: 15614014298    时间: 2016-4-12 19:55
把你这个类setDaemonThread也贴出来看看,估计是这个类的run方法已经运行完了,所以在循环之前你的两个线程已经结束了
作者: 这个名字也有宇    时间: 2016-4-13 13:57
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
作者: 15614014298    时间: 2016-4-13 21:16
setDaemon必须在线程开始的时候设置,所以你的setName应该写在setDaemon方法下面
作者: 491482538    时间: 2016-4-13 21:39
我也遇到了这个问题同问
作者: 星空下的初吻    时间: 2016-4-13 23:26
同问啊  !!!!




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