定义和启动线程

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

  • 提供一个Runnable对象. Runnableinterface定义一个单一方法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方法不执行任何操作。应用程序可以提供run的子类Thread,如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对象所涉及的其他线程中调用的。我们将在以下各节中研究其中一些方法。