Java 使用join将把异步方法转为同步

有时候我们需要在当前线程等待在其他线程执行结束后,将这些线程处理的结果汇总。简单将就是阻塞等待其他线程结束。通过join方法即可实现。

代码如下:

public class Async2Sync {

    static volatile int count1 = 0;
    static volatile int count2 = 0;
    public static void main(String[] args) throws InterruptedException {

        Thread backThread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(500L);
                        System.out.println("backThrad1: count1 = "+count1);
                        count1++;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        });

        Thread backThread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(500L);
                        System.out.println("backThrad2: count2 = "+count2);
                        count2++;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        });
        backThread1.start();
        backThread2.start();
        backThread1.join();
        backThread2.join();
        Thread.sleep(1300L);
        System.out.println("main: count = " + (count1 + count2));

        System.out.println("main End");


    }
}


打印结果如下

> Task :Async2Sync.main()
backThrad2: count2 = 0
backThrad1: count1 = 0
backThrad2: count2 = 1
backThrad1: count1 = 1
backThrad2: count2 = 2
backThrad1: count1 = 2
backThrad1: count1 = 3
backThrad2: count2 = 3
backThrad1: count1 = 4
backThrad2: count2 = 4
backThrad2: count2 = 5
backThrad1: count1 = 5
backThrad2: count2 = 6
backThrad1: count1 = 6
backThrad2: count2 = 7
backThrad1: count1 = 7
backThrad1: count1 = 8
backThrad2: count2 = 8
backThrad1: count1 = 9
backThrad2: count2 = 9
main: count = 20
main End

可以看出使用join后主线程等待backThrad2和backThrad2结束后才拿到了最后结果的和,这中间是阻塞的。

如果注释掉join,我们可以看到如下打印结果:

> Task :Async2Sync.main()
backThrad1: count1 = 0
backThrad2: count2 = 0
backThrad2: count2 = 1
backThrad1: count1 = 1
main: count = 4
main End
backThrad2: count2 = 2
backThrad1: count1 = 2
backThrad1: count1 = 3
backThrad2: count2 = 3
backThrad1: count1 = 4
backThrad2: count2 = 4
backThrad2: count2 = 5
backThrad1: count1 = 5
backThrad2: count2 = 6
backThrad1: count1 = 6
backThrad2: count2 = 7
backThrad1: count1 = 7
backThrad1: count1 = 8
backThrad2: count2 = 8
backThrad1: count1 = 9
backThrad2: count2 = 9

可以看出,在没有join的情况下,主线程直接往下执行了,没有进行阻塞等待其他线程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值