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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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