Java的join()方法

Java中的join()方法由java.lang.Thread类提供,允许一个线程等待另一个线程执行完毕。假设th是Thread类的对象,其线程当前正在执行,那么th.join()语句确保在程序执行下一条语句之前th执行完毕。当有多个线程调用join()方法时,会对join()方法进行重载,允许开发人员指定等待的时间段。然而,类似于Java中的sleep()方法,join()方法也依赖于操作系统的计时,因此我们不应该假设join()方法会等待我们在参数中指定的时间。以下是三种重载的join()方法。

重载的join()方法的描述

join(): 当调用join()方法时,当前线程停止执行并进入等待状态。当前线程将保持等待状态,直到调用join()方法的线程达到终止状态。如果线程被中断,则会抛出InterruptedException。

语法:

public final void join() throws InterruptedException  

join(long mls): 当调用join()方法时,当前线程停止执行并进入等待状态。当前线程将保持等待状态,直到调用join()方法的线程死亡或等待的指定时间(以毫秒为单位)结束。

语法:

public final synchronized void join(long mls) throws InterruptedException, where mls is in milliseconds

join(long mls, int nanos): 当调用join()方法时,当前线程停止执行并进入等待状态。当前线程将保持等待状态,直到调用join()方法的线程死亡或等待的指定时间(以毫秒+纳秒为单位)结束。

语法:

public final synchronized void join(long mls, int nanos) throws InterruptedException, where mls is in milliseconds.

Java中join()方法的示例

下面的程序展示了join()方法的用法。

文件名:ThreadJoinExample.java

// 一个用于理解的Java程序  
// 线程的加入 
  
// 导入语句  
import java.io.*;  
  
// ThreadJoin 类是 Thread 类的子类  
class ThreadJoin extends Thread  
{  
//覆盖运行方法   
public void run()  
{  
for (int j = 0; j < 2; j++)  
{  
try  
{  
// 使线程休眠 300 毫秒   
Thread.sleep(300);  
System.out.println("The current thread name is: " + Thread.currentThread().getName());  
}  
//catch 块用于捕获引发的异常    
catch(Exception e)  
{  
System.out.println("The exception has been caught: " + e);  
}  
System.out.println( j );  
}  
}  
}  
  
public class ThreadJoinExample  
{  
//主要方法   
public static void main (String argvs[])  
{  
  
//创建3个线程    
ThreadJoin th1 = new ThreadJoin();  
ThreadJoin th2 = new ThreadJoin();  
ThreadJoin th3 = new ThreadJoin();  
  
//线程th1开始   
th1.start();  
  
//在什么时候开始第二个线程 
//第一个线程 th1 已经结束或死亡。  
try  
{  
System.out.println("The current thread name is: "+ Thread.currentThread().getName());  
  
//  调用 join() 方法  
th1.join();  
}  
  
// catch 块用于捕获引发的异常 
catch(Exception e)  
{  
System.out.println("The exception has been caught " + e);  
}  
  
//线程th2开始   
th2.start();  
  
// 在线程 th2 结束或死亡后启动 th3 线程。 
try  
{  
System.out.println("The current thread name is: " + Thread.currentThread().getName());  
th2.join();  
}  
  
//  catch 块用于捕获引发的异常    
catch(Exception e)  
{  
System.out.println("The exception has been caught " + e);  
}  
  
//线程th3开始   
th3.start();  
}  
}  

输出:

The current thread name is: main
The current thread name is: Thread - 0
0
The current thread name is: Thread - 0
1
The current thread name is: main
The current thread name is: Thread - 1
0
The current thread name is: Thread - 1
1
The current thread name is: Thread - 2
0
The current thread name is: Thread - 2
1

解释:上面的程序展示了第二个线程th2在第一个线程th1结束后开始执行,并且线程th3在第二个线程th2结束或终止后开始执行。

join()方法:InterruptedException

我们在join()方法的描述中学到,当线程被中断时,会导致抛出InterruptedException异常。下面的示例展示了这一点。

文件名:ThreadJoinExample1.java

class ABC extends Thread  
{  
Thread threadToInterrupt;  
// 覆盖 run() 方法   
public void run()  
{  
// 调用方法中断  
threadToInterrupt.interrupt();  
}  
}  
  
  
public class ThreadJoinExample1  
{  
// 主要方法   
public static void main(String[] argvs)  
{  
try  
{  
// 创建类 ABC 的对象    
ABC th1 = new ABC();  
  
th1.threadToInterrupt = Thread.currentThread();  
th1.start();  
  
// 调用 join() 方法导致     
// 到 InterruptedException 的产生  
th1.join();  
}  
catch (InterruptedException ex)  
{  
System.out.println("The exception has been caught. " + ex);  
}  
}  
}  

输出:

The exception has been caught. java.lang.InterruptedException

join()方法的更多示例

让我们看一些其他的例子。

文件名:TestJoinMethod1.java

class TestJoinMethod1 extends Thread{    
 public void run(){    
  for(int i=1;i<=5;i++){    
   try{    
    Thread.sleep(500);    
   }catch(Exception e){System.out.println(e);}    
  System.out.println(i);    
  }    
 }    
public static void main(String args[]){    
 TestJoinMethod1 t1=new TestJoinMethod1();    
 TestJoinMethod1 t2=new TestJoinMethod1();    
 TestJoinMethod1 t3=new TestJoinMethod1();    
 t1.start();    
 try{    
  t1.join();    
 }catch(Exception e){System.out.println(e);}    
    
 t2.start();    
 t3.start();    
 }    
}    

输出:

       1
       2
       3
       4
       5
       1
       1
       2
       2
       3
       3
       4
       4
       5
       5

我们可以看到在上面的例子中,当t1完成任务后,t2和t3开始执行。

join(long milliseconds)方法的示例

文件名:TestJoinMethod2.java

class TestJoinMethod2 extends Thread{    
 public void run(){    
  for(int i=1;i<=5;i++){    
   try{    
    Thread.sleep(500);    
   }catch(Exception e){System.out.println(e);}    
  System.out.println(i);    
  }    
 }    
public static void main(String args[]){    
 TestJoinMethod2 t1=new TestJoinMethod2();    
 TestJoinMethod2 t2=new TestJoinMethod2();    
 TestJoinMethod2 t3=new TestJoinMethod2();    
 t1.start();    
 try{    
  t1.join(1500);    
 }catch(Exception e){System.out.println(e);}    
    
 t2.start();    
 t3.start();    
 }    
}    
Output:

输出:

        1
       2
       3
       1
       4
       1
       2
       5
       2
       3
       3
       4
       4
       5
       5

在上面的示例中,当t1完成1500毫秒(3次)的任务后,t2和t3开始执行。

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想