Joins

Joins

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 sleepjoin 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 sleepjoin responds to an interrupt by exiting with an InterruptedException.  如同sleep()方法,join()方法響應中斷並在中斷時拋出InterruptedException。app

The SimpleThreads Example

一個簡單的線程例子 
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!");
    }
}

相關文章
相關標籤/搜索