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
对象的其他线程调用的。我们将在以下部分中研究其中一些方法。