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