zoukankan      html  css  js  c++  java
  • 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;
    }
    }
    }

  • 相关阅读:
    2017ICPC南宁补题
    H. The Game of Life
    I
    Twice Equation
    (贪心+队列)String
    Marcin and Training Camp
    莫比乌斯函数模版
    HDU-1695 莫比乌斯反演
    Steps to One DP+莫比乌斯反演
    Educational Codeforces Round 62 (Rated for Div. 2)
  • 原文地址:https://www.cnblogs.com/zmblog/p/9618597.html
Copyright © 2011-2022 走看看