# 定义和启动线程

> 原文： [https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html](https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html)

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

*   _ 提供`Runnable`对象。_ [`Runnable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html) 接口定义了一个方法`run`，意味着包含线程中执行的代码。 `Runnable`对象传递给`Thread`构造函数，如 [``HelloRunnable``](examples/HelloRunnable.java)示例：

    ```
    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``](examples/HelloThread.java)示例：

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