通过使用Thread.join()函数使异步线程变得同步

在多线程中往往用到join()的方法,join()是什么呢?

Thread类的Join()措施能够将两个交替运行的线程并合为次序运行的线程。例如在线程B中调用了线程A的Join()措施,线程A将插入线程B之前,直到线程A运行告终后,才会继续运行线程B。

代码如下:

package com.cn.process;

public class test {

/**
 * @param args
 */

public class hello implements Runnable
{

    @Override
    public void run() {
        // TODO Auto-generated method stub
         for (int i = 0; i < 3; i++) 
         { 
                                                      System.out.println(Thread.currentThread().getName()+i);            
         }

}

}

public static void main(String[] args) throws InterruptedException {
    String threadName = Thread.currentThread().getName();    
    test test=new test();
    hello he=test.new hello();

    Thread demo = new Thread(he,"线程");//第二个参数是线程名称(自定义)           
    demo.start();//调用start方法但是调用该方法只是准备线程并不是马上启动
    demo.join(); //强制执行demo,只有当demo线程执行结束之后主线程才能继续当前主线程执行--相当于在主线程中添加了demo的子线程, 使异步执行线程转为同步执行
    //demo.start();//join()方法在start()前后显示的结果明显的不一样  可以证明只有当start()启动后 才能正确执行join() 
    for(int i=0;i<50;++i)
    {     
                System.out.println(threadName +"线程执行-->"+i);           
             }         

}

}
  执行的结果是:

线程0
线程1
线程2
main线程执行–>0
main线程执行–>1
main线程执行–>2
main线程执行–>3
main线程执行–>4
main线程执行–>5
main线程执行–>6
main线程执行–>7
main线程执行–>8
main线程执行–>9
main线程执行–>10
main线程执行–>11
main线程执行–>12
main线程执行–>13
main线程执行–>14
main线程执行–>15
main线程执行–>16
main线程执行–>17
main线程执行–>18
main线程执行–>19
main线程执行–>20
main线程执行–>21
main线程执行–>22
main线程执行–>23
main线程执行–>24
main线程执行–>25
main线程执行–>26
main线程执行–>27
main线程执行–>28
main线程执行–>29
main线程执行–>30
main线程执行–>31
main线程执行–>32
main线程执行–>33
main线程执行–>34
main线程执行–>35
main线程执行–>36
main线程执行–>37
main线程执行–>38
main线程执行–>39
main线程执行–>40
main线程执行–>41
main线程执行–>42
main线程执行–>43
main线程执行–>44
main线程执行–>45
main线程执行–>46
main线程执行–>47
main线程执行–>48
main线程执行–>49

ok 成功 起到了join的作用!

当我注释掉前面的start()的时候,

以下是代码片段:

//demo.start();//调用start方法但是调用该方法只是准备线程并不是马上启动
demo.join(); //强制执行demo,只有当demo线程执行结束之后主线程才能继续当前主线程执行–相当于在主线程中添加了demo的子线程, 使异步执行线程转为同步执行
demo.start();//join()方法在start()前后显示的结果明显的不一样 可以证明只有当start()启动后 才能执行join() 也就是说 当join()在前面的话就失去了意义

执行结果可能是(cpu有关):

线程0
main线程执行–>0
main线程执行–>1
main线程执行–>2
main线程执行–>3
main线程执行–>4
main线程执行–>5
main线程执行–>6
main线程执行–>7
main线程执行–>8
main线程执行–>9
线程1
线程2
main线程执行–>10
main线程执行–>11
main线程执行–>12
main线程执行–>13
main线程执行–>14
main线程执行–>15
main线程执行–>16
main线程执行–>17
main线程执行–>18
main线程执行–>19
main线程执行–>20
main线程执行–>21
main线程执行–>22
main线程执行–>23
main线程执行–>24
main线程执行–>25
main线程执行–>26
main线程执行–>27
main线程执行–>28
main线程执行–>29
main线程执行–>30
main线程执行–>31
main线程执行–>32
main线程执行–>33
main线程执行–>34
main线程执行–>35
main线程执行–>36
main线程执行–>37
main线程执行–>38
main线程执行–>39
main线程执行–>40
main线程执行–>41
main线程执行–>42
main线程执行–>43
main线程执行–>44
main线程执行–>45
main线程执行–>46
main线程执行–>47
main线程执行–>48
main线程执行–>49

这就可以看出了 join()先后顺序是否起作用了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值