注册 登录
编程论坛 JAVA论坛

Daemon线程

yu1543054075 发布于 2015-06-08 19:54, 441 次点击
public class ThreadA {
    public static void main(String[] args) {
        System.out.println("ThreadA执行:");
        
        Thread threadB = new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("ThreadB开始:");
                    for (int i = 0; i < 5; i++ ) {
                        Thread.sleep(1000);
                        System.out.println("ThreadB执行..");
                    }
                    System.out.println("ThreadB即将结束..");
                }
                catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        );
        threadB.start();
                threadB.setDaemon(true);//设置为Daemon线程
        System.out.println("ThreadA执行..");
    }
}
C:\Users\Administrator\Desktop\classes>java ThreadA
ThreadA执行:
ThreadB开始:
Exception in thread "main" java.lang.IllegalThreadStateException
        at java.lang.Thread.setDaemon(Thread.java:1275)
        at ThreadA.main(ThreadA.java:121)
ThreadB执行..
ThreadB执行..
ThreadB执行..
ThreadB执行..
ThreadB执行..
ThreadB即将结束..
为什么没有执行System.out.println("ThreadA执行..");这个语句,求指导
3 回复
#2
凌风zx2015-06-09 19:13
threadB.setDaemon(true); 必须在 threadB.start();之前设置

线程启动后不能在设置为守护线程
 
运行到threadB.setDaemon(true);时已经报异常了 所以后面的System.out.println("ThreadA执行..");没执行

但threadB已经启动了所以threadB的run方法执行了
#3
yu15430540752015-06-10 17:42
非常感谢版主的解释,那么下面的是怎么回事?
public class ThreadA {
    public static void main(String[] args) {
        System.out.println("ThreadA执行:");
        
        Thread threadB = new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("ThreadB开始:");
                    for (int i = 0; i < 5; i++ ) {
                        Thread.sleep(1000);
                        System.out.println("ThreadB执行..");
                    }
                    System.out.println("ThreadB即将结束..");
                }
                catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        );
        threadB.setDaemon(true);//设置为Daemon线程
        threadB.start();
        System.out.println("ThreadA执行");
    }
}
//
//C:\Users\Administrator\Desktop\classes>java ThreadA
//ThreadA执行
//ThreadA执行
//ThreadB开始
为什么不是ThreadA执行
          ThreadB开始
          ThreadA执行
求指导!!
#4
凌风zx2015-06-10 19:54
回复 3楼 yu1543054075
你既然学了线程就应该明白啊

多线程虽然是串行的  但是通过cpu时间分片可以达到一定的并行效果

所以线程之间的运行顺序是不确定的

第一句是必然先执行的 B线程启动后 两个线程同时运行 后两句的顺序应该是不确定的
1