黑马程序员技术交流社区

标题: 多线程问题--main线程结束,从线程怎么还在执行 [打印本页]

作者: endian11    时间: 2014-6-7 19:27
标题: 多线程问题--main线程结束,从线程怎么还在执行
多线程中,main线程结束之后,从线程怎么还在执行啊,请看以下代码:
class JoinThread extends Thread
{
        private int i;
        public void run()
        {
                try
                {
                        sleep(10);
                        for (; i < 1000 ; i++ )
                        {
                                System.out.println(getName() + " " + i);
                        }
                }
                catch (Exception e)
                {
                        System.out.println(e.toString());
                }                       
               
        }

        public static void main(String[] args)  
        {
                JoinThread jt = new JoinThread();
                jt.start();
                System.out.println("Hello World!");
        }
}
执行结果如下:
Hello World!
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
Thread-0 10
。。。。


为什么主线程都打印hello world结束了,Thread0还在执行,而且thread0还休眠了10s让出了处理器
作者: superob123    时间: 2014-6-7 19:37
线程分守护线程和用户线程,线程默认为用户线程,线程是分开的,相互不影响,要不也不叫多线程
作者: 李小然    时间: 2014-6-7 19:39
在你的代码中,有两个线程:主线程和jt线程

这两个线程都属于前台线程,只有当两个线程都结束后,程序才会结束。
不存在main线程完成,jt就要强制退出的结果。

可以使用守护线程,来实现你想要的效果。
将jt设置为守护线程,当前台线程(main线程)结束后,守护线程强制结束。

class JoinThread extends Thread
{
        private int i;
        public void run()
        {
                try
                {
                        //这里改为100,可以让jt一个都不能输出
                        sleep(100);
                        for (; i < 1000 ; i++ )
                        {
                                System.out.println(getName() + " " + i);
                        }
                }
                catch (Exception e)
                {
                        System.out.println(e.toString());
                }                        

        }

        public static void main(String[] args)  
        {
                JoinThread jt = new JoinThread();
                //守护线程必须在线程开启之前设置。
                jt.setDaemon(true);
                jt.start();
                System.out.println("Hello World!");
        }
}


作者: felixzr    时间: 2014-6-7 20:38
还没学到多线程,唉




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