thread.join的本质

Posted silyvin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thread.join的本质相关的知识,希望对你有一定的参考价值。

Java代码  技术图片
  1. //等待者  
  2. synchronized (对象)  
  3.     while(条件不满足)  
  4.         对象.wait()  
  5.       
  6.     dosomething();  
  7.   
  8. //通知者  
  9. synchronized (对象)  
  10.     改变条件  
  11.     对象.notifyAll();  
  12.   


    现在说到join,大家都知道join方法的试用场景,就是当我们在A线程调用了线程B.join(),则只有线程A会进入BLOCK(实际是WAITING OR TIMED_WAITING)状态,当线程B执行完成后,A线程才会继续执行 
看一下join的实现源码,就会发现,内部也是上述等待-通知模型 

Java代码  技术图片
  1. public final synchronized void join(long millis)  
  2.     throws InterruptedException   
  3.         long base = System.currentTimeMillis();  
  4.         long now = 0;  
  5.   
  6.         if (millis < 0)   
  7.             throw new IllegalArgumentException("timeout value is negative");  
  8.           
  9.   
  10.         if (millis == 0)   
  11.             while (isAlive())   
  12.                 wait(0);  
  13.               
  14.          else   
  15.             while (isAlive())   
  16.                 long delay = millis - now;  
  17.                 if (delay <= 0)   
  18.                     break;  
  19.                   
  20.                 wait(delay);  
  21.                 now = System.currentTimeMillis() - base;  
  22.               
  23.           
  24.       


    即A线程先通过synchronized,获得B线程的锁,再while判断B线程是否存活,存活则wait阻塞,直到B线程执行结束退出,线程退出时会调用notifyAll()方法。 
这里之所以用while方法,是为了在被唤醒之后再确认一下是否满足了条件。 
    因此A线程会等到B线程执行结束才会继续

以上是关于thread.join的本质的主要内容,如果未能解决你的问题,请参考以下文章

使用 threading.Thread.join()

Java Thread.join的作用和原理

std::thread.join() 死锁

std::thread.join() 做啥?

浅析 Java Thread.join()

浅析Thread的join() 方法