The join
method allows one thread to wait for the completion of another. If t
is a Thread
object whose thread is currently executing,java
t.join();
causes the current thread to pause execution until t
's thread terminates. Overloads of join
allow the programmer to specify a waiting period. However, as with sleep
, join
is dependent on the OS for timing, so you should not assume thatjoin
will wait exactly as long as you specify. 將會使當前線程暫停執行並等待t執行完成。重載的join()方法可讓開發者自定義等待週期。然而,和sleep()方法同樣join()方法依賴於操做系統的時間處理機制,你不能假定join()方法將會精確的等待你所定義的時長。oracle
Like sleep
, join
responds to an interrupt by exiting with an InterruptedException
. 如同sleep()方法,join()方法響應中斷並在中斷時拋出InterruptedException。app
一個簡單的線程例子
oop
The following example brings together some of the concepts of this section. SimpleThreads
consists of two threads. The first is the main thread that every Java application has. The main thread creates a new thread from the Runnable
object,MessageLoop
, and waits for it to finish. If the MessageLoop
thread takes too long to finish, the main thread interrupts it. 下面這個簡單的例子將會把這一節的一些概念放到一塊兒演示。SimpleThreads程序有兩個線程組成,第一個是主線程,它從建立了一個線程並等待它執行完成。若是MessageLoop線程執行了太長時間,主線程將會將其中斷。this
The MessageLoop
thread prints out a series of messages. If interrupted before it has printed all its messages, the MessageLoop
thread prints a message and exits. MessageLoop線程將會打印一系列的信息。若是中斷在它打印完全部信息前發生,它將會打印一個特定的消息並退出。 spa
public class SimpleThreads { // Display a message, preceded by // the name of the current thread static void threadMessage(String message) { String threadName = Thread.currentThread().getName(); System.out.format("%s: %s%n", threadName, message); } private static class MessageLoop implements Runnable { public void run() { String importantInfo[] = { "Mares eat oats", "Does eat oats", "Little lambs eat ivy", "A kid will eat ivy too" }; try { for (int i = 0; i < importantInfo.length; i++) { // Pause for 4 seconds Thread.sleep(4000); // Print a message threadMessage(importantInfo[i]); } } catch (InterruptedException e) { threadMessage("I wasn't done!"); } } } public static void main(String args[]) throws InterruptedException { // Delay, in milliseconds before // we interrupt MessageLoop // thread (default one hour). long patience = 1000 * 60 * 60; // If command line argument // present, gives patience // in seconds. if (args.length > 0) { try { patience = Long.parseLong(args[0]) * 1000; } catch (NumberFormatException e) { System.err.println("Argument must be an integer."); System.exit(1); } } threadMessage("Starting MessageLoop thread"); long startTime = System.currentTimeMillis(); Thread t = new Thread(new MessageLoop()); t.start(); threadMessage("Waiting for MessageLoop thread to finish"); // loop until MessageLoop // thread exits while (t.isAlive()) { threadMessage("Still waiting..."); // Wait maximum of 1 second // for MessageLoop thread // to finish. t.join(1000); if (((System.currentTimeMillis() - startTime) > patience) && t.isAlive()) { threadMessage("Tired of waiting!"); t.interrupt(); // Shouldn't be long now // -- wait indefinitely t.join(); } } threadMessage("Finally!"); } }