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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© て淡莣了陌生 中级黑马   /  2013-4-27 11:11  /  1197 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 て淡莣了陌生 于 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还会继续打印呢??求解释!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
守护线程方法的调用 应该是在线程启动之前调用吧   也就是得
               t1.start();
                t2.setDaemon(true); //放在t2.start();之前
                t2.start();
回复 使用道具 举报
//把守护线程放在线程开启之前,因为线程起动起来了就不可以设置为守护线程.
//异常是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();
}
      
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果要设置守护线程就必须在线程起动之前,这是个前提
所以
t1.start();
t2.start();
t2.setDaemon(true);
应该改为
t2.setDaemon(true);
t1.start();
t2.start();
或者
t1.start();
t2.setDaemon(true);
t2.start();

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马