下面的例子SimpleThreads中用到了2-5节中的几个方法和概念。
SimpleThreads中有两个线程,一个是所有Java程序都有的主线程main,另一个就是在主线程中创建的runnble对象——循环输出消息的线程t,t在主线程中调用了join方法,因此主线程需等待线程t的完成。但如果t线程运行时间过长(本例中用patience加以控制),主线程就会中断。
在本例中有许多输出语句, 用以反映线程运行状态及线程对interrupt异常的反应。
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!"); } }运行结果:
main: Starting MessageLoop thread main: Waiting for MessageLoop thread to finish main: Still waiting... main: Still waiting... main: Still waiting... main: Still waiting... main: Still waiting... Thread-0: Mares eat oats main: Still waiting... main: Still waiting... main: Still waiting... main: Still waiting... Thread-0: Does eat oats main: Still waiting... main: Still waiting... main: Still waiting... main: Still waiting... Thread-0: Little lambs eat ivy main: Still waiting... main: Still waiting... main: Still waiting... main: Still waiting... Thread-0: A kid will eat ivy too main: Finally!
偷偷把patience改掉之后呢:
long patience = 1000 * 60 * 60;改为 long patience = 1000;
运行效果是这样的:
main: Starting MessageLoop thread main: Waiting for MessageLoop thread to finish main: Still waiting... main: Tired of waiting! Thread-0: I wasn't done! main: Finally!原文:
http://docs.oracle.com/javase/tutorial/essential/concurrency/simple.html