Java线程中的方法2——join方法

首先讲到join方法时则需要先看看下面这个执行结果:

可以发现的是线程1与线程而一直在争夺执行权,二者的执行顺序毫无逻辑可言,当时如果我是想实现让线程1先执行,其后线程2执行这该怎么实现呢?当然就是通过今天讲的join方法,该方法可以实现,先看看代码:

package com.juc.init.thread;

public class ThreadDemo5 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            int cnt = 0;
            while (cnt < 10) {
                System.out.println("线程1---" + cnt++);
            }
        });
        Thread t2 = new Thread(() -> {
            int cnt = 0;
            while (cnt < 10) {
                System.out.println("线程2---" + cnt++);
            }
        });
        t1.start();
        System.out.println("线程1状态"+t1.getState());
        t1.join();
        System.out.println("线程1状态"+t1.getState());
        t2.start();
    }
}

输出结果如下:

 

清晰的可见,线程1执行完成之后,状态已经是TERMINATED,线程2才开始执行。join方法还有两个个重载方法:

 分别表示等待几毫秒和等待毫秒加上等待几纳秒执行后续的线程。

接下来看看join方法是怎么实现的,首先不管是无参的还是两个参数的最终调用的都是一个参数的方法那么我们Ctrl+B跟进源码:

首先映入眼帘的就是synchronized同步关键字,也就是调用了该同步方法后,该线程就霸占了cpu的执行权,导致其他线程将无法执行,主要原理找到了。其次是延迟释放锁,我们发现while条件中,当线程存活并且还有剩余延迟时间则会循环调用wait方法实现线程等待的过程。

那么本次的分享就到这里,如果有讲错的地方还请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值