• join()方法跟踪


    #join方法跟踪
    java.lang.Thread.join() 进入线程的join方法,实际上线程thread是实现的 runnable接口 class Thread implements Runnable
    当jion方法没有传参的时候底层还是调的里面的join(long)这个方法,默认值为0 join(0)
    >java.lang.Thread.join(long) 这个方法就是join的底层实现,通过wait()方法来实现
    join实现源码
    public final synchronized void join(long millis) 同步方法
    throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;
    //根据入参,也就是你传的时间进行判断
    if (millis < 0) {
    throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
    while (isAlive()) { //isAlive()是你调用join的那个线程,如果t.join(),那么这个就表示t的状态。线程还活跃在执行,则主线程无限wait等待,知道t线程执行完则跳出join执行下面方法
    //小知识,wait阻塞的是当前对象所在的线程,因为当前对象为线程t,所以此时阻塞的是t所在的main线程,通常就是主线程
    //使用wait时,必须要获取当前对象的锁,线程的等待,唤醒,同步都需要对象锁,wait是等待并会释放锁等其他线程去获取当前锁,而sleep则不会释放
    //如果我们把里面的wait(0)改为sleep则虽然进入了此方法,但是主线程的锁并没有释放,所以还会继续往下执行,
    wait(0);
    }
    } else {
    while (isAlive()) { //传入值时,和上面同理,只是多了一个时间运算
    long delay = millis - now;
    if (delay <= 0) {
    break;
    }
    wait(delay);
    now = System.currentTimeMillis() - base;
    }
    }
    }

  • 相关阅读:
    IOS cocos2d笔记1
    [转] 函数调用的栈分配
    iOS 静态类库项目的建立与使用
    Brew 编译mod错误Error: L6265E: Non-RWPI Section libspace.o(.bss) cannot be assigned to PI Exec region ER_ZI
    [LeetCode]7、Reverse Integer
    [LeetCode]1、Two Sum
    java学习路线和知识图谱
    《Java编程思想》第十一章 持有对象
    《Java编程思想》第十章 内部类
    《Java编程思想》第十三章 字符串
  • 原文地址:https://www.cnblogs.com/zmblog/p/9618597.html
Copyright © 2020-2023  润新知