该Java教程是为JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不建议使用的选项的信息,请参阅JDK发布说明。
创建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
对象的其他线程调用的。我们将在下面的章节中介绍其中一些方法。