定义和启动线程

原文: https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

创建Thread实例的应用程序必须提供将在该线程中运行的代码。有两种方法可以做到这一点:

  • 提供Runnable对象。Runnable 接口定义了一个方法run,意味着包含线程中执行的代码。 Runnable对象传递给Thread构造器,如 HelloRunnable示例:

    1. public class HelloRunnable implements Runnable {
    2. public void run() {
    3. System.out.println("Hello from a thread!");
    4. }
    5. public static void main(String args[]) {
    6. (new Thread(new HelloRunnable())).start();
    7. }
    8. }
  • 子类化ThreadThread类本身实现Runnable,尽管它的run方法什么都不做。应用程序可以子类化Thread,提供自己的run实现,如 HelloThread示例:

    1. public class HelloThread extends Thread {
    2. public void run() {
    3. System.out.println("Hello from a thread!");
    4. }
    5. public static void main(String args[]) {
    6. (new HelloThread()).start();
    7. }
    8. }

请注意,两个示例都会调用Thread.start以启动新线程。

你应该使用哪些成语?第一个使用Runnable对象的习语更为通用,因为Runnable对象可以继承Thread以外的类。第二个习惯用法在简单的应用程序中更容易使用,但受限于你的任务类必须是Thread的后代这一事实。本课重点介绍第一种方法,它将Runnable任务与执行任务的Thread对象分开。这种方法不仅更灵活,而且适用于后面介绍的高级线程管理 API。

Thread类定义了许多对线程管理有用的方法。这些方法包括static方法,它们提供有关调用方法的线程的信息或影响其状态。从管理线程和Thread对象所涉及的其他线程调用其他方法。我们将在以下部分中研究其中一些方法。