浅谈线程Join()的用法

new Thread(new Runnable() {
            public void run() {
            }
        });

相信大家对这段代码很熟悉,在进行异步操作的时候,会经常用到它。
假如有两个线程同时执行的话,分别处理一段输出的逻辑,代码如下:
public static void main(String[] args) {
        final Thread A = new Thread(new Runnable() {
            public void run() {
                printTest("A");
            }
        });
        Thread B = new Thread(new Runnable() {
            public void run() {
                    printTest("B");
            }
        });
        A.start();
        B.start();
    }

    public static void printTest(String threadName){
        int count = 0;
        while(count < 5){
            count++;
            System.out.println(threadName + ":" + count);
        }
    }

运行结果:
第一次运行
B==1
A==1
B==2
A==2
B==3
A==3
B==4
B==5
A==4
A==5
第二次运行
A==1
B==1
A==2
B==2
A==3
B==3
B==4
B==5
A==4
A==5
发现不是每次运行的结果顺序都不一样,这不是我们当时设计的初衷,我们想的是先执行完A再执行B的,但是这个结果不是我们想要的。这里主要是因为线程间是默认是没法保证哪个先执行的,所以两次的结果才出现不一致的情况。那么,有没有办法让A先执行完再执行B呢?答案当然是有了,这时候join就起到作用了,咱们在B线程里代码加上这么一句A.join()即可,修改后的代码如下:

public static void main(String[] args) {
        final Thread A = new Thread(new Runnable() {
            public void run() {
                printTest("A");
            }
        });
        Thread B = new Thread(new Runnable() {
            public void run() {
                    try {
                    A.join();//此处加入join,表示先执行完A线程后再执行此后面的语句
                    printTest("B");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        A.start();
        B.start();
    }

    public static void printTest(String threadName){
        int count = 0;
        while(count < 5){
            count++;
            System.out.println(threadName + ":" + count);
        }
    }

咱们再看下运行的结果如何,是否达到我们的目的:
第一次运行
A==1
A==2
A==3
A==4
A==5
B==1
B==2
B==3
B==4
B==5
第二次运行
A==1
A==2
A==3
A==4
A==5
B==1
B==2
B==3
B==4
B==5
哈哈,到这里知道join的用处了吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值