• join方法底层实现


    简述

      join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。

    底层

      首先我们需要知道join方法底层是用wait方法实现的,所以join方法也会释放锁。

    wait方法机制

      这里在介绍底层前首先得介绍wait方法的一种机制,当wait方法获取的锁对象是线程实例的时候,线程的任务执行完后会notifyall所有在此线程实例上的wait队列里的线程

    public class HighConcurrency {
        public static void main(String[] args) {
            try {
                Thread threadTest = new Thread(){
                    public void run(){
                        System.out.println("执行线程中方法");
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
                threadTest.start();
                synchronized(threadTest){
                    threadTest.wait();//当线程终止的时候,会调用线程自身的notifyAll()方法
                }
                System.out.println("执行到了这里");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

      执行结果:

    执行线程中方法
    执行到了这里

      可以看到并没有线程执行了threadTest.notify但主线程中却被唤醒了,这正是这种机制的体现,当threadTest线程终止的时候会唤醒以

    threadTest为锁的wait队列上的线程

    join方法底层

      我们再来看join方法的源码

    public final synchronized void join(long millis) throws InterruptedException {
            long base = System.currentTimeMillis();
            long now = 0L;
            if (millis < 0L) {
                throw new IllegalArgumentException("timeout value is negative");
            } else {
                if (millis == 0L) {
                    while(this.isAlive()) {
                        this.wait(0L);
                    }
                } else {
                    while(this.isAlive()) {
                        long delay = millis - now;
                        if (delay <= 0L) {
                            break;
                        }
    
                        this.wait(delay);
                        now = System.currentTimeMillis() - base;
                    }
                }
    
            }
        }

      可以看到join方法底层就是调用了wait方法,我们调用一个线程的join,因为join方法是synchronized修饰的所以会获取该线程实例的锁,然后释放锁进入wait队列,当线程终止的时候也就会唤醒现在等待的线程。合起来也就是join方法的逻辑了。

      我们还可以看到如果有时间的参数,则会wait固定時間。如果被虛假喚醒了,則會檢查獲得鎖的綫程有沒有存貨,若終止了則不再等待。

     

    一点一点积累,一点一点蜕变!
  • 相关阅读:
    客户端session与服务端session
    对session和cookie的一些理解
    Servlet生命周期与工作原理
    Linux命令行编辑快捷键
    含有GROUP BY子句的查询中如何显示COUNT()为0的成果(分享)
    设计模式学习——准备(UML类图)
    find()方法
    js中的动态效果
    动态添加,移除,查找css属性的方法
    VUE中的require ( )
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/15098895.html
Copyright © 2020-2023  润新知