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线程执行结束才会继续

猜你喜欢

转载自www.cnblogs.com/silyvin/p/11374368.html