黑马程序员技术交流社区

标题: 多线程join的问题 [打印本页]

作者: joechen    时间: 2013-10-30 17:23
标题: 多线程join的问题
想问一下t1.start();t2.start();t1.join()在如下代码的执行顺序       
       


       
class  JoinDemo
{
        public static void main(String[] args) throws InterruptedException
        {
                Demo d=new Demo();
                Thread t1=new Thread(d);
                Thread t2=new Thread(d);
                t1.start();
                t2.start();
                t1.join() ;      //  t1  t2交替执行,直到t1执行完毕 ?
                                    //   先 t1  t2交替执行,在调用t1.join()后只执行t1?

        for (int x=0;x<50 ;x++ )
        {System.out.println("hello world");
        }
               
        }
}
class Demo implements Runnable
{
        public void run()
        {
                for (int x=0;x<60 ;x++ )
                {
                        System.out.println(Thread.currentThread().getName()+"---run"+x);
                }
        }
}


作者: 靓仔    时间: 2013-10-30 17:49
刚开始执行主线程时,t1和t2都参与了当执行了t1.join时,主线程停止,这时只有t1和t2在抢夺cpu执行权,当t1执行完毕后,主线程才开始执行,如果t2还没有执行完,这时主线程就和t2就互相抢夺cpu执行权了
join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。
作者: joechen    时间: 2013-10-30 17:52
靓仔 发表于 2013-10-30 17:49
刚开始执行主线程时,t1和t2都参与了当执行了t1.join时,主线程停止,这时只有t1和t2在抢夺cpu执行权,当t1 ...

谢谢了,:lol
作者: Jim-剣◆﹏    时间: 2013-10-30 19:59
查了书
正确的执行顺序是
先 t1  t2交替执行,假设此时t1打印到了10,t2打印到了12
在调用t1.join()后,此时t1从10一直占据CPU的执行权,从11一直输出到50,输出完毕后,t2再接着从12开始输出...




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