07_控制线程_join_线程插队

【join线程简述】

join()方法:Thread提供的让一个线程去等待另一个线程完成。当在某个程序执行流中(如main线程)调用其它线程(如t2线程)的join方法(t2.join()),调用线程(main线程)将被阻塞,直到被join()方法加入的join线程(t2.start())执行完成为止。

【示例代码】

package com.Higgin.part02;

class JoinThread implements  Runnable{
    
    //重写run方法,定义线程执行体
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"===="+i);
        }
    }
}
public class Demo01 {
    public static void main(String[] args) throws InterruptedException {
        JoinThread jt=new JoinThread();
        Thread t1=new Thread(jt,"Higgin");
        Thread t2=new Thread(jt,"被join的线程");
        t1.start();   //启动t1线程
        
        //下面属于main主线程
        for(int i=0;i<100;i++){
            if(i==20){
                t2.start();   //启动t2线程
                //main线程调用了t2线程的join方法,导致main线程必须等待t2执行结束才可以向下执行
                t2.join();
            }
            System.out.println(Thread.currentThread().getName()+"===="+i);
        }
    }
}

【运行结果】

一开始,main线程启动了名为"Higgin"的t1线程,此时总共两个线程并发执行,分别是main主线程和Higgin线程,

后来在main主线程中的for循环中,当i==20时候,又启动了t2线程,并且调用了t2线程的join的方法,直接导致main线程阻塞。

因为main线程已经阻塞,所以接下来是"Higgin"和"被join的线程"两者抢占运行,如果"被join的线程"运行结束,main线程进入就绪状态,然后抢占运行,如Higgin线程没结束的话。

【补充】

join()方法有三种重载形式;

1. join() :即等待被join()的线程执行完成

2. join(long millis):等待被join()的线程的最长时间为millis毫秒,如果时间到了,被join的线程仍未执行结束,那么就不等了。

3. join(long millis,int nanos):增加了一个纳秒,等待被join()的线程的最长时间为millis毫秒和nanos纳秒(很少用,一般精确到毫秒就行)

原文地址:https://www.cnblogs.com/HigginCui/p/5903357.html