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 |
|
来自: moonboat > 《concurrent》