这些Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请查看Java语言更改,了解Java SE 9及后续版本中更新的语言特性的摘要。
请查看JDK发布说明,了解所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
以下示例将本节中的一些概念汇集在一起。SimpleThreads
由两个线程组成。第一个线程是每个Java应用程序都有的主线程。主线程从Runnable
对象MessageLoop
创建一个新线程,并等待其完成。如果MessageLoop
线程花费的时间过长,主线程会中断它。
MessageLoop
线程打印一系列消息。如果在打印所有消息之前被中断,MessageLoop
线程将打印一条消息并退出。
public class SimpleThreads { // 显示一条消息,前面带上 // 当前线程的名称 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[] = { "马吃燕麦", "母鹿吃燕麦", "小羊吃常春藤", "小孩也会吃常春藤" }; try { for (int i = 0; i < importantInfo.length; i++) { // 暂停4秒 Thread.sleep(4000); // 打印一条消息 threadMessage(importantInfo[i]); } } catch (InterruptedException e) { threadMessage("我还没完成呢!"); } } } public static void main(String args[]) throws InterruptedException { // 在中断MessageLoop // 线程之前延迟的毫秒数(默认为一小时)。 long patience = 1000 * 60 * 60; // 如果有命令行参数 // 则将等待时间设置为秒数。 if (args.length > 0) { try { patience = Long.parseLong(args[0]) * 1000; } catch (NumberFormatException e) { System.err.println("参数必须是整数。"); System.exit(1); } } threadMessage("启动MessageLoop线程"); long startTime = System.currentTimeMillis(); Thread t = new Thread(new MessageLoop()); t.start(); threadMessage("等待MessageLoop线程完成"); // 循环直到MessageLoop // 线程退出 while (t.isAlive()) { threadMessage("仍在等待..."); // 最多等待1秒 // 直到MessageLoop线程完成。 t.join(1000); if (((System.currentTimeMillis() - startTime) > patience) && t.isAlive()) { threadMessage("等得太久了!"); t.interrupt(); // 现在不应该再等了 // -- 无限等待 t.join(); } } threadMessage("终于完成了!"); } }