1.3 等待线程执行终止的join方法

等待线程执行终止的join方法

在项目中往往会遇到这样一个场景,就是需要等待几件事情都给做完后才能走下面的事情。这个时候就需要用到Thread方法下的Join方法。join方法是无参且没有返回值的。

package com.baidu.onepakage;

public class JoinTest {
 

    public static void main(String[] args) throws InterruptedException {
        Thread theadOne = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("TheadOne run over");
        });

        Thread threadTwo = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("TheadTwo run over");
        });

        theadOne.start();
        Thread.sleep(1000);
        threadTwo.start();
        System.out.println("main 开始启动了");
        theadOne.join();
        threadTwo.join();
        System.out.println("main 结束了");
    }
}

  上面代码在调用join方法的时候,主线程就被被阻塞了,只有当调用join的方法执行结束都才能够接着往下面执行。
执行结果:

  1. System.out.println(“TheadOne run over”);
  2. System.out.println(“TheadTwo run over”);
  3. System.out.println(“main 开始启动了”);
  4. System.out.println(“main 结束了”);

  另外线程A调用线程B的join方法,当其他线程调用了线程A的interrupt()方法,则A线程会抛出InterruptedException异常而返回。

示例:

package com.baidu.onepakage;

public class JoinTest01 {

    public static void main(String[] args) {
        Thread threadOne = new Thread(() -> {
            for (; ; ) {
            }
        });
        // 获取主线程
        Thread mainThread = Thread.currentThread();
        // 线程2
        Thread threadTwo = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 中断主线程
            mainThread.interrupt();
        });


        threadOne.start();
        threadTwo.start();

        try {
            threadOne.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println(Thread.currentThread().getName() + "发生了异常");
        }
    }
}

  上面是Mian主方法抛出了异常,这是因为在在调用ThreadOne线程,和ThreadTwo线程时线程one还在执行中(死循环),这个时候main方法处于阻塞状态,当调用主方法的interrupt()方法后,Main方法已经被阻塞了,所以就抛出了异常并返回了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值