码迷,mamicode.com
首页 > 其他好文 > 详细

thread.join的本质

时间:2019-08-18 23:41:12      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:ali   lse   app   rom   new   结束   parent   system   就是   

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的本质

标签:ali   lse   app   rom   new   结束   parent   system   就是   

原文地址:https://www.cnblogs.com/silyvin/p/11374368.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!