当前位置:首页 > java基础 > 正文内容

Thread join的原理

淙嶙7年前 (2018-09-10)java基础545

先写段都知道的代码,一个主类,两个线程类,保证线程的执行先后顺序,使用join方法。

package com.dl.study.m4;

public class TestThread {
    public static void main(String[] args) throws InterruptedException {
        ThreadOne one = new ThreadOne();
        one.join();
        ThreadTwo two = new ThreadTwo();
        Thread threadTwo = new Thread(two);
        threadTwo.join();

        one.start();
        threadTwo.start();
    }
}

class ThreadOne extends Thread{
    @Override
    public void run(){
        System.out.println("I am first thread,my name is "+Thread.currentThread().getName());
    }
}
class ThreadTwo implements Runnable{
    @Override
    public void run(){
        System.out.println("I am second thread,my name is "+Thread.currentThread().getName());
    }
}

join使ThreadOne和TreadTwo依次顺序执行,其中的原理是什么,来看下Thread中的join方法:

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

                    this.wait(var7);
                    var5 = System.currentTimeMillis() - var3;
                }
            }

        }
}

synchronized线程锁,使得线程按照先后顺序进入,依次等待执行。进入等待队列后,线程执行顺序就确定了。

相关文章

动态代理

动态代理

一、实现动态代理的方式: jdk动态代理CGlib动态代理javassist动态代理 CGlib底层实现依赖于ASM, javassist自成一派. 由于ASM和javassist需要程序员直接操...

Java中的为什么只有值传递

Java中的为什么只有值传递

1.基本类型和引用类型在内存中的保存Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。基本类型的变量保存原始值,即它代表的值就是数值本身;而引用类型的变量...

集合各实现类的底层实现原理(转)

集合各实现类的底层实现原理(转)

ArrayList实现原理要点概括 ArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素。 底层使用数组实现 该集合是可变长度数组,数组扩容时,会将老数组中的元素重...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。