黑马程序员技术交流社区

标题: 守护线程问题 [打印本页]

作者: て淡莣了陌生    时间: 2013-4-27 11:11
标题: 守护线程问题
本帖最后由 て淡莣了陌生 于 2013-4-28 08:35 编辑

class Daemon {
        
        public static void main(String[] args) {
                Thread t1 = new Thread(){                                                        
                        public void run() {                                       
                                for (int i = 0; i < 2; i++) {
                                        System.out.println("A");
                                        try {
                                                Thread.sleep(1000);
                                        } catch (Exception e) {
                                                e.printStackTrace();        
                                        }
                                }
                        }         
                };
               
                Thread t2 = new Thread(new Runnable(){                                
                        public void run() {                                       
                                for (int i = 0; i < 5; i++) {
                                        System.out.println("B");
                                        try {
                                                Thread.sleep(1000);
                                        } catch (Exception e) {
                                                e.printStackTrace();        
                                        }
                                }
                        }
                });               
                t1.start();
                t2.start();
                t2.setDaemon(true);
        }
               
}

这段关于守护线程的代码执行后为什么不但会抛异常,而且打印完A后,B还会继续打印呢??求解释!
作者: 刘凯    时间: 2013-4-27 11:49
守护线程方法的调用 应该是在线程启动之前调用吧   也就是得
               t1.start();
                t2.setDaemon(true); //放在t2.start();之前
                t2.start();

作者: 付鑫鑫    时间: 2013-4-27 15:46
//把守护线程放在线程开启之前,因为线程起动起来了就不可以设置为守护线程.
//异常是java.lang.IllegalThreadStateException,非法的线程状态.
public class Demo03 {
        public static void main(String[] args) {
        Thread t1 = new Thread(){                                                      
                public void run() {                                       
                        for (int i = 0; i < 2; i++) {
                                System.out.println("A");
                                try {
                                        Thread.sleep(1000);
                                } catch (Exception e) {
                                        e.printStackTrace();      
                                }
                        }
                }        
        };
      
        Thread t2 = new Thread(new Runnable(){                              
                public void run() {                                       
                        for (int i = 0; i < 5; i++) {
                                System.out.println("B");
                                try {
                                        Thread.sleep(1000);
                                } catch (Exception e) {
                                        e.printStackTrace();      
                                }
                        }
                }
        });               
        t2.setDaemon(true);                                                          //把守护线程放在线程开启之前,因为线程起动起来了就不可以设置为守护线程.
        t1.start();
        t2.start();
}
      
}

作者: 吴波    时间: 2013-4-27 16:38
如果要设置守护线程就必须在线程起动之前,这是个前提
所以
t1.start();
t2.start();
t2.setDaemon(true);
应该改为
t2.setDaemon(true);
t1.start();
t2.start();
或者
t1.start();
t2.setDaemon(true);
t2.start();





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