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

  • 相关阅读:
    Python3.4的Pillow库实现验证码图片
    希尔排序
    二分法排序
    [算法天天练]选择排序
    冒泡 [Python]
    python -- 结构数据类型(列表、元组、集合、字典)
    python -- 字符串操作
    python -- 基础语法
    python -- 环境搭建
    Unittest方法 -- 以test开头实例
  • 原文地址:https://www.cnblogs.com/silyvin/p/11374368.html
Copyright © 2020-2023  润新知