辐射4 混凝土 购买:example of join another thread

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 13:58:35
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("%tT %s: %s%n", Calendar.getInstance(), 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;
        long patience = 1000 * 10;

        //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 2 second for MessageLoop thread to
            //finish.
            t.join(2000);
            if (((System.currentTimeMillis() - startTime) > patience) &&
                    t.isAlive()) {
                threadMessage("Tired of waiting!");
                t.interrupt();
                //Shouldn't be long now -- wait indefinitely
                t.join();
            }

        }
        threadMessage("Finally!");
    }
}


when call t.join, the current main thread will be pause to wait thread of t to completed it's work util it to die.


15:47:16 main: Starting MessageLoop thread
15:47:16 main: Waiting for MessageLoop thread to finish
15:47:16 main: Still waiting...
15:47:18 main: Still waiting...
15:47:20 Thread-0: Mares eat oats
15:47:20 main: Still waiting...
15:47:22 main: Still waiting...
15:47:24 Thread-0: Does eat oats
15:47:24 main: Still waiting...
15:47:26 main: Tired of waiting!
15:47:26 Thread-0: I wasn't done!
15:47:26 main: Finally!

Process finished with exit code 0