zoukankan      html  css  js  c++  java
  • 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固定時間。如果被虛假喚醒了,則會檢查獲得鎖的綫程有沒有存貨,若終止了則不再等待。

     

    一点一点积累,一点一点蜕变!
  • 相关阅读:
    config 文件夹中的 dev.env.js
    config 文件夹中的 index.js
    Dialog 对话框 可拖拽
    Pagination 分页 封装
    ElasticSearch学习03--使用Java连接ES
    ElasticSearch学习02--使用Kibana管理ES
    ElasticSearch学习01--基本结构与操作
    redis学习02--使用Jedis调用Redis
    redis学习01--常用命令
    Java基础学习08--JDK1.8特性
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/15098895.html
Copyright © 2011-2022 走看看