该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对象的其他线程调用的。我们将在下面的章节中介绍其中一些方法。