Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
创建 Thread 实例的应用程序必须提供将在该线程中运行的代码。有两种方法可以做到这一点:
Runnable 对象。 Runnable 接口定义了一个方法 run,意味着包含在线程中执行的代码。Runnable 对象传递给 Thread 构造函数,如 HelloRunnable 示例:
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
Thread。 Thread 类本身实现了 Runnable,尽管它的 run 方法没做任何操作。应用程序可以继承 Thread,提供自己的 run 实现,如 HelloThread 示例:
public class HelloThread extends Thread {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new HelloThread()).start();
}
}
请注意,两个示例都调用 Thread.start 以启动新线程。
你应该使用哪一种习惯用法?第一种使用 Runnable 对象的习惯用法更为通用,因为 Runnable 对象可以继承 Thread 以外的类。第二种习惯用法在简单的应用程序中更容易使用,但受限于你的任务类必须是 Thread 的后代类这一事实。本课重点介绍第一种方法,该方法将 Runnable 任务与执行任务的 Thread 对象分开。这种方法不仅更灵活,而且适用于后面介绍的高级线程管理 API。
Thread 类定义了许多对线程管理有用的方法。这些方法包括 static 方法,它们提供有关调用方法的线程的信息或影响其状态。其他方法是从管理线程及 Thread 对象的其他线程调用的。我们将在以下部分中研究其中一些方法。