并发编程-join源码分析
1、测试Thread.join()方法代码如下
public static void main(String[] args) throws InterruptedException { SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss"); System.out.println(""+sdf.format(new Date())); Thread t = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("执行t线程"); } catch (InterruptedException e) { e.printStackTrace(); } } }); t.start(); try { t.join(); System.out.println("=========main线程执行完成========="+sdf.format(new Date())); } catch (InterruptedException e) { e.printStackTrace(); } }
2、查看join方法,发现底层通过synchronized+while(isAlive())循环判断t线程存活状态+Object.wait() 实现
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) { //通过isAlive()循环判断Thread对象t的存活状态,直到t线程死亡 while (isAlive()) { //1、调用Object.wait(0)方法释放锁,线程进入阻塞状态,等待获取锁 //2、阻塞状态线程抢占锁成功后,继续通过isAlive()循环判断Thread对象t的存活状态 //2.1、线程存活,调用Object.wait(0)方法释放锁,线程进入阻塞状态,等待获取锁 //2.2、线程死亡,继续执行等待线程的逻辑 wait(0); } } else { //通过isAlive()循环判断Thread对象t的存活状态,直到t线程死亡, while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } //1、调用Object.wait(delay)方法线程进入TIMED_WAIT状态,等待delay时间后,线程进入阻塞状态,等待获取锁 //2、被阻塞的线程获取到锁后,继续通过isAlive()循环判断Thread对象t的存活状态,直到t线程死亡 //2.1、线程存活,则继续调用Object.wait(delay)方法线程进入TIMED_WAIT状态,等待delay时间后,线程进入阻塞状态,等待获取锁 //2.2、线程死亡,则执行等待线程的下面逻辑 wait(delay); now = System.currentTimeMillis() - base; } } }

浙公网安备 33010602011771号