最近在编程遇到了个需要异步执行的操作,经过了一番折腾,发现在主子线程操作中join()方法是非常实用且有效的一个方法.
先来看join()及其重载(overload)方法的说明和代码:

join()方法:
 1     /**
 2      * Waits for this thread to die. 
 3      *
 4      * @exception  InterruptedException if another thread has interrupted
 5      *             the current thread.  The <i>interrupted status</i> of the
 6      *             current thread is cleared when this exception is thrown.
 7      */
 8     public final void join() throws InterruptedException {
 9         join(0);
10     }

join(long millis)方法:
 1     /**
 2      * Waits at most <code>millis</code> milliseconds for this thread to 
 3      * die. A timeout of <code>0</code> means to wait forever. 
 4      *
 5      * @param      millis   the time to wait in milliseconds.
 6      * @exception  InterruptedException if another thread has interrupted
 7      *             the current thread.  The <i>interrupted status</i> of the
 8      *             current thread is cleared when this exception is thrown.
 9      */
10     public final synchronized void join(long millis) throws InterruptedException {
11
12         long base = System.currentTimeMillis();
13         long now = 0;
14 
15         if (millis < 0) {
16             throw new IllegalArgumentException("timeout value is negative");
17         }
18 
19         if (millis == 0) {
20             while (isAlive()) {
21                 wait(0);
22             }
23         } else {
24             while (isAlive()) {
25                 long delay = millis - now;
26                 if (delay <= 0) {
27                     break;
28                 }
29                 wait(delay);
30                 now = System.currentTimeMillis() - base;
31             }
32         }
33     }

join(long millis, int nanos)方法:
 1     /**
 2      * Waits at most <code>millis</code> milliseconds plus 
 3      * <code>nanos</code> nanoseconds for this thread to die. 
 4      *
 5      * @param      millis   the time to wait in milliseconds.
 6      * @param      nanos    0-999999 additional nanoseconds to wait.
 7      * @exception  IllegalArgumentException  if the value of millis is negative
 8      *               the value of nanos is not in the range 0-999999.
 9      * @exception  InterruptedException if another thread has interrupted
10      *             the current thread.  The <i>interrupted status</i> of the
11      *             current thread is cleared when this exception is thrown.
12      */
13     public final synchronized void join(long millis, int nanos) throws InterruptedException {
15 
16         if (millis < 0) {
17             throw new IllegalArgumentException("timeout value is negative");
18         }
19 
20         if (nanos < 0 || nanos > 999999) {
21             throw new IllegalArgumentException("nanosecond timeout value out of range");
23         }
24 
25         if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
26             millis++;
27         }
28 
29         join(millis);
30     }
31 

在使用中需要注意的地方有:

    1. join()方法定义在Thread类中,所以只有线程可以直接调用它.
    2. join()方法会有可能抛出InterruptedException,需要用try/catch语句块包围;
    3. join()方法的作用是"Waits for this thread to die",所以你要start()该线程先.

下面再看一个使用join()方法的实例:

 1 import java.io.*;
 2 
 3 public class JoinDemo {
 4 
 5         public static void main(String[] args){
 6             
 7               ThreadMain main = new ThreadMain();
 8               //启动主线程
 9               main.start();
10               
11       }
12 }
13 
14 //主线程类
15 class ThreadMain extends Thread{
16         
17         ThreadSub sub = new ThreadSub();
18     
19         public void run(){
20               
21               System.out.println("ThreadMain starts!");
22               //启动子线程
23               sub.start();
24               
25               System.out.println("ThreadMain running before threadsub!");
26 
27               try{
28                   sub.join();
29               }catch(InterruptedException e){
30                 e.printStackTrace();
31               }
32 
33               System.out.println("ThreadMain running after threadsub!");
34               
35               System.out.println("ThreadMain ends!");
36       }
37 }
38 
39 //子线程类
40 class ThreadSub extends Thread{
41 
42         public void run(){
43             
44                 System.out.println("ThreadSub starts!");
45                 
46                 for(int i = 0; i < 10; i++){
47                    System.out.println("ThreadSub running: " + (i+1));
48                 }
49                 
50                 System.out.println("ThreadSub ends!");
51       }    
52 }

输出结果为:

ThreadMain starts!
ThreadMain running before threadsub
!
ThreadSub starts
!
ThreadSub running: 
1
ThreadSub running: 
2
ThreadSub running: 
3
ThreadSub running: 
4
ThreadSub running: 
5
ThreadSub running: 
6
ThreadSub running: 
7
ThreadSub running: 
8
ThreadSub running: 
9
ThreadSub running: 
10
ThreadSub ends
!
ThreadMain running after threadsub
!
ThreadMain ends
!

通过这个例子可以更好地理解"Waits for this thread to die"的含义.