首页 > 代码库 > Thread线程join方法自我理解

Thread线程join方法自我理解

Thread线程join方法自我理解

thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.join();后面的代码

thread.join(long time):线程thread等待time时间之后,main-thread可以执行,注意time时间后,线程thread没有执行完,main-thread也可以运行

注意:上面2个方法必须在线程是alive的时候,才有这样的效果,否则不会有。

join()方法源码是有调用wait()方法的,wait方法是Object的方法,线程wait时,是释放对象锁的,所以调用join()方法是释放对象锁的线程阻塞同wait()方法。

class Runner1 implements Runnable{
    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + " begin...");
            Thread.sleep(2000);//①
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " finish...");
    }
}

class Runner2 implements Runnable{
    @Override
    public void run() {
        
        try {
            System.out.println(Thread.currentThread().getName() + " begin...");
            Thread.sleep(1000);//②
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " finish...");
    }
}

public class Test_thread_join {

    /**
     * Thread.join()等待线程结束,再执行Thread.join后面的代码
     * Thread.join(n)等待线程结束或者n时间后,执行Thread.join后面的代码
     */
    public static void main(String[] args) {
        Runner1 r1 = new Runner1();
        Runner2 r2 = new Runner2();
        Thread t1 = new Thread(r1, "Thread-A");
        Thread t2 = new Thread(r2, "Thread-B");
        t1.start();//t1是alive的
        t2.start();
        try {
            t1.join();//当执行这个代码的时候,main线程阻塞,t2.这个线程可能运行着,也可能结束了
            t2.join();//如果在t1.join()执行的时候,t2线程已经运行结束,那这行代码是没有效果的
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        run();
    }
    public static void run(){
        for(int i = 0; i < 5; i++){
            System.out.println("main i:" + i);
        }
    }
}
大意:
Thread-A睡眠2秒,Thread-B睡眠1秒
执行结果:
技术分享

结论:t1.join();执行时,main方法阻塞等待t1线程执行完;t1线程执行完之后,程序执行t2.join(),此时t2线程已经死亡了运行结束了,这行代码没有效果没有意义。如果t2没有死亡,那么main-thread,必须等待Thread-B死亡,才能执行后面的代码。如果这行代码被注释了,并且t1.join()执行完之后t2线程仍然是alive的,那么main-thread和Thread-B线程将竞争CPU资源,他们的运行方式可能是交互式的。

 

 

Thread线程join方法自我理解