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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© joechen 中级黑马   /  2013-10-30 17:23  /  899 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

想问一下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);
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

3 个回复

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

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
靓仔 发表于 2013-10-30 17:49
刚开始执行主线程时,t1和t2都参与了当执行了t1.join时,主线程停止,这时只有t1和t2在抢夺cpu执行权,当t1 ...

谢谢了,:lol
回复 使用道具 举报
查了书
正确的执行顺序是
先 t1  t2交替执行,假设此时t1打印到了10,t2打印到了12
在调用t1.join()后,此时t1从10一直占据CPU的执行权,从11一直输出到50,输出完毕后,t2再接着从12开始输出...

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

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