Documentation

The Java™ Tutorials
Hide TOC
The SimpleThreads ExampleSimpleThreads示例
Trail: Essential Java Classes
Lesson: Concurrency
Section: Thread Objects

The SimpleThreads ExampleSimpleThreads示例

The following example brings together some of the concepts of this section. 下面的示例汇集了本节的一些概念。SimpleThreads consists of two threads. SimpleThreads由两个线程组成。The first is the main thread that every Java application has. 第一个是每个Java应用程序都拥有的主线程。The main thread creates a new thread from the Runnable object, MessageLoop, and waits for it to finish. 主线程从Runnable对象MessageLoop创建一个新线程,并等待它完成。If the MessageLoop thread takes too long to finish, the main thread interrupts it.如果MessageLoop线程需要太长时间才能完成,则主线程会中断它。

The MessageLoop thread prints out a series of messages. MessageLoop线程打印出一系列消息。If interrupted before it has printed all its messages, the MessageLoop thread prints a message and exits.如果在打印所有消息之前中断,MessageLoop消息循环线程将打印一条消息并退出。

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!");
    }
}

Previous page: Joins
Next page: Synchronization