首页 > 代码库 > 07_控制线程_join_线程插队

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纳秒(很少用,一般精确到毫秒就行)

 

07_控制线程_join_线程插队