在java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join 方法后面的代码。
简单点说就是,将两个线程合并,用于实现同步的功能。
具体而言:可以通过线程A的join() 方法来等待线程A的结束,或者使用线程A的join(1000)方法来等到线程A的结束,但是最多只等待1s.(时间数自己随便改。)
请看如下具体的例子,相信就会明白了
1.最原始的线程
1 public class TestJoin { 2 3 public static void main(String[] args) { 4 Thread t = new Thread(new ThreadImp()); 5 t.start(); 6 try { 7 //主线程的执行 8 for(int i=0;i<=5;i++){ 9 System.out.println("当前为主线程,此时i为"+i); 10 Thread.sleep(1000); 11 } 12 13 System.out.println("join Finished"); 14 } catch (InterruptedException e) { 15 // TODO Auto-generated catch block 16 e.printStackTrace(); 17 } 18 19 } 20 21 } 22 23 class ThreadImp implements Runnable{ 24 25 @Override 26 public void run() { 27 try{ 28 System.out.println("ThreadImp is begining"); 29 Thread.sleep(5000); 30 31 System.out.println("ThreadImp End"); 32 33 }catch(InterruptedException e){ 34 e.printStackTrace(); 35 } 36 37 } 38 39 }
执行结果为:
当前为主线程,此时i为0
ThreadImp is begining
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
当前为主线程,此时i为4
ThreadImp End
当前为主线程,此时i为5
join Finished
看以看到,最基本的线程之间来回切换执行。
2.当在主线程中代用 t线程的join方法后(不设置等待时间)
public class TestJoin { public static void main(String[] args) { Thread t = new Thread(new ThreadImp()); t.start(); try { t.join();//判断t线程是否还在 if(t.isAlive()){ System.out.println("the t has not finished."); }else{ System.out.println("the t has finished."); } //主线程的执行 for(int i=0;i<=5;i++){ System.out.println("当前为主线程,此时i为"+i); Thread.sleep(1000); } System.out.println("join Finished"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class ThreadImp implements Runnable{ @Override public void run() { try{ System.out.println("ThreadImp is begining"); Thread.sleep(5000); System.out.println("ThreadImp End"); }catch(InterruptedException e){ e.printStackTrace(); } } }
运行结果为:
ThreadImp is begining
ThreadImp End
the t has finished.
当前为主线程,此时i为0
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
当前为主线程,此时i为4
当前为主线程,此时i为5
join Finished
可以看出 ,在主线程中调用t.join()方法, 导致t线程结束后再执行后面的主线程。
3. 设置join()等待的时间后
1 public class TestJoin { 2 3 public static void main(String[] args) { 4 Thread t = new Thread(new ThreadImp()); 5 t.start(); 6 try { 7 t.join(2000);//主线程只等待t线程结束,只等待2秒 8 //判断t线程是否还在 9 if(t.isAlive()){ 10 System.out.println("the t has not finished."); 11 }else{ 12 System.out.println("the t has finished."); 13 } 14 //主线程的执行 15 for(int i=0;i<=5;i++){ 16 System.out.println("当前为主线程,此时i为"+i); 17 Thread.sleep(1000); 18 } 19 20 System.out.println("join Finished"); 21 } catch (InterruptedException e) { 22 // TODO Auto-generated catch block 23 e.printStackTrace(); 24 } 25 26 } 27 28 } 29 30 class ThreadImp implements Runnable{ 31 32 @Override 33 public void run() { 34 try{ 35 System.out.println("ThreadImp is begining"); 36 Thread.sleep(5000); 37 38 System.out.println("ThreadImp End"); 39 40 }catch(InterruptedException e){ 41 e.printStackTrace(); 42 } 43 44 } 45 46 }
运行结果:
ThreadImp is begining
the t has not finished.
当前为主线程,此时i为0
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
ThreadImp End
当前为主线程,此时i为4
当前为主线程,此时i为5
join Finished
可以得到,t线程运行,等待t线程2s时间后,主线程便迫不及待的执行,此时t线程还没结束,然后t线程和主线程交替执行。