为什么我使用了join方法却并没有抢占执行

为什么我使用了join方法却并没有抢占执行

package Test;

class MyJoin extends Thread{
    MyJoin(String name){
        super(name);
    }
    public void run(){
        for(int i=1;i<100;i++){
            System.out.println(getName()+",你妈炸了");
        }
    }
}
public class Join {
    public static void main(String[] args){
        MyJoin one = new MyJoin("one");
        MyJoin two = new MyJoin("two");
        
        one.start();
        two.start();
        
        try {
            two.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        

        
    }
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

使用了join()方法也不一定被抢占执行,100次循环执行的时间很短,one线程先启动,有可能还没执行到join方法,one线程就已经执行完了。

  • 慕运维2948618 提问者 #1
    但是问题在于我调到1000000次循环了,但是他们还是交叉运行的,有时候是one,有时候是two,而不是先two后one。这是为什么?
    2017-04-07 10:58:02
  • 好帮手慕珊 回复 提问者 慕运维2948618 #2
    你这段代码其实不能完全控制two抢占了one的资源,one和two先启动,他们启动后就会先执行,然后才是join()方法执行,所以在join()方法执行之前one和two是可以交叉执行的。现在其实有三个线程在执行one、two和主线程,所以执行的顺序是不好保证的。视频里面只有主线程和另一个线程,那个线程调用join()方法了,那么抢占了主线程的资源,主线程后面的代码就不会先执行,所以只有一个线程的内部调用join()方法才能保证该线程后面的代码不被执行。在后面的线程间通信章节中,可以去控制一个线程执行完再去执行另一个线程。
    2017-04-07 11:25:33
  • 慕运维2948618 提问者 #3
    非常感谢!
    2017-04-07 14:36:40
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师