线程thread中join的用法详解

在线程中调用其他线程的join方法

1.首先创建一个线程,在主线程中main中运行

public class Thread01 extends Thread {

    @Override
    public void run() {
        try {
            for (int i = 0; i <100 ; i++) {
                Thread.sleep(50);  //sleep 线程睡一会,再到既定时间醒来加入到就绪状态
                System.out.println("线程1正在执行循环"+i+"次");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
             System.out.println("线程1执行结束");
    }
}
public class Demo02 {
    public static void main(String[] args) {
        Thread01 thread01=new Thread01();
        //在主线程中,调用线程1的join方法,就是说thread01方法执行结束了
        //main方法才能执行
        //线程1要先start再join
        thread01.start();
        try {
            thread01.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束");



    }
}

运行结果:
在这里插入图片描述

结论1:当在一个线程中调用其他线程(线程A)的join方法,那么要求线程A执行完成后,才能执行当前线程

注意:要求先start方法再join方法才行,不能搞反

上述例子的基础上,在main方法中再调用线程2,不要join方法,线程2是否会对结果又影响?或者线程1调用join方法是否会对线程2有影响??

public class Demo03 {
    public static void main(String[] args) {
        Thread01 thread01=new Thread01();
        Thread02 thread02=new Thread02();
        thread01.start();
        thread02.start();  //启动了线程2
        try {
            thread01.join();  //还是只调用了线程1的join方法
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束");
    }
}

运行结果:
线程1在结束的时候,线程main再执行,线程2在线程1结束前和后都在执行,说明线程2和线程1没有关系,也和main方法没有关系,

在这里插入图片描述

join()传入参数:

public class Demo04 {
    public static void main(String[] args) {
        Thread01 thread01=new Thread01();
        thread01.start();
        try {
            //join方法传入参数
            //当前线程主线程main等待300毫秒后,两个线程变成并行执行
            //如果不传参,相当于当前线程(主线程)无限制等待线程01执行完成后它才执行
            thread01.join(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束");
    }
}

运行结果:
当前线程主线程main等待300毫秒后,两个线程变成并行执行
如果不传参,相当于当前线程(主线程)无限制等待线程01执行完成后它才执行

在这里插入图片描述

join()和start()调用顺序问题

前面提到的需要先start方法,在调用join才有效果,因为start方法是线程开始运行,如果一个线程都没有开始运行,调用join方法是没有意义的
join()方法底层调用了wait方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值