現有線程threadone、threadtwo和threadthree,想要的運行順序為threadone->threadtwo->threadthree,應該如何處理?這里需要用到一個簡單的線程方法join().
join()方法的說明:join方法掛起當前調用線程,直到被調用線程完成后在繼續執行(join() method suspends the execution of the calling thread until the object called finishes its execution).
下面看一個例子:
/** * Thread one for test. */ public class ThreadOne implements Runnable { @Override public void run() { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start..."); System.out.println(threadName + " end."); } }
/** * Thread two for test. */ public class ThreadTwo implements Runnable { @Override public void run() { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start..."); System.out.println(threadName + " end."); } }
/** * Thread three for test. */ public class ThreadThree implements Runnable { @Override public void run() { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start..."); System.out.println(threadName + " end."); } }
public class JoinMainTest { public static void main(String[] args) { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start..."); Thread firstThread = new Thread(new ThreadOne()); Thread secondThread = new Thread(new ThreadTwo()); Thread thirdThread = new Thread(new ThreadThree()); // 1. no order thread run firstThread.start(); secondThread.start(); thirdThread.start(); System.out.println(threadName + " end."); } }
上面得到的結果如下:
/**
*
main start...
Thread-0 start...
main end.
Thread-0 end.
Thread-1 start...
Thread-1 end.
Thread-2 start...
Thread-2 end.
*/
public class JoinMainTest { public static void main(String[] args) { String threadName = Thread.currentThread().getName(); System.out.println(threadName + " start..."); Thread firstThread = new Thread(new ThreadOne()); Thread secondThread = new Thread(new ThreadTwo()); Thread thirdThread = new Thread(new ThreadThree()); // 2. thread run in order try { firstThread.start(); firstThread.join(); secondThread.start(); secondThread.join(); thirdThread.start(); thirdThread.join(); } catch (Exception ex) { System.out.println("thread join exception."); } System.out.println(threadName + " end."); } }
這里得到的結果就是順序執行的了:
/**
*
main start...
Thread-0 start...
Thread-0 end.
Thread-1 start...
Thread-1 end.
Thread-2 start...
Thread-2 end.
main end.
*/
再來看一下join()的源碼,join()調用的就是join(0).可以看到,其實join就是wait,直到線程執行完成。
public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } }
}