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

Thread join的原理

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

先写段都知道的代码,一个主类,两个线程类,保证线程的执行先后顺序,使用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需要程序员直接操...

ArrayList简介

ArrayList简介

ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable,...

触发JVM进行Full GC的情况及应对策略(转)

触发JVM进行Full GC的情况及应对策略(转)

堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,如下图所示: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称...

发表评论

访客

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