zoukankan      html  css  js  c++  java
  • 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线程执行结束才会继续

  • 相关阅读:
    Qt通用方法及类库9
    设计模式原则(7)--Composition&AggregationPrinciple(CARP)--合成&聚合复用原则
    设计模式原则(6)--Open-Closed Principle(OCP)--开闭原则
    鼠标悬停出现页面
    设计模式(23)--Visitor--访问者模式--行为型
    设计模式(22)--Template Method(模板方法模式)--行为型
    设计模式(21)--Strategy(策略模式)--行为型
    设计模式(20)--State(状态模式)--行为型
    设计模式(19)--Observer(观察者模式)--行为型
    设计模式(18)--Memento(备忘录模式)--行为型
  • 原文地址:https://www.cnblogs.com/silyvin/p/11374368.html
Copyright © 2011-2022 走看看