Java 多线程:如何使用 Runnable 接口创建线程?

Java Multithreading : how does thread creation with Runnable interface work?

有人可以解释这段代码的作用吗? new Thread(new X()).start();

其余代码:

class X implements Runnable {
    X() {}
    }
    public static void main(String[] arg) {
        new Thread(new X()).start();
    }
}

这是一个非常简单的示例,它展示了如何创建一个新线程并 运行 它。当你在 Java 中创建新线程时,你给了他们一些事情要做 - "Runnable".

class X implements Runnable

这个接口只有一个方法 - 运行()。所以你创建了一个新线程,在它的构造函数中有一个 运行nable。

new Thread(new X())

创建新线程后,必须使用 start() 方法启动它。这是它调用 运行nable 的 运行() 方法的时候。在你的例子中,这只是在线程构造之后被链接:

new Thread(new X()).start();

现在,这个例子的不寻常之处在于 class X 实际上并没有实现 运行 方法。但通常情况下,会有额外的一点,所以你的例子看起来像这样:

class X implements Runnable {
    public void run() {
        System.out.println("This is running on a different thread!");
    }

    public static void main(String[] arg) {
        new Thread(new X()).start();
    }
}

首先,如果它是空白的,则不需要定义构造函数。如果你不定义它会自动为空。其次,您可以简单地进行匿名 class 定义,稍后我将对此进行解释。在这种情况下,该方法不是主要的,它是 运行。您也可以使用匿名 class 定义来定义线程对象。

new Thread() {
    @Override
    public void run() {
        //Code here
    }
}.start();

匿名 class 定义允许您同时定义和实例化 class 其中 extends/implements 另一个 class 而无需实际创建 class.另外,请注意 X.main() 是静态的,这意味着 X 的任何实例都不会具有该方法。您想要覆盖 运行 并调用开始。 Start 只是一个在不同线程中调用 运行 的方法。请注意,您不能启动一个线程两次。

每个线程对象都有一个方法运行()。如果你调用thread对象的start()方法,那么它会执行运行().

唯一的区别是它将被执行separately/parallely而不是在现有的操作顺序中。

您可以通过两种方式创建线程:一种是通过扩展 Thread,另一种是通过实现 Runnable 接口。

如果您不扩展 Thread class,您的 class 对象将不会被视为线程对象。所以你必须显式地创建 Thread class object.

Thread class 将在构造函数中将 Runnable class 作为参数。

您将实现 Runnableclass X 的对象传递给 Thread 构造函数,这样您的 class run() 方法将是从 Thread.start() 方法执行。

您可以通过两种不同的方式创建线程。查看关于 thread creation

的 oracle 文档

An application that creates an instance of Thread must provide the code that will run in that thread. There are two ways to do this:

  1. Provide a Runnable object. Runnable 接口定义了一个方法,运行,用于包含在线程中执行的代码。 The Runnable object is passed to the Thread constructor

    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();
        }
    }
    
  2. Subclass Thread。 Thread class 本身实现了 Runnable,尽管它的 运行 方法什么都不做。应用程序可以子 class Thread,提供自己的 运行

    实现
    public class HelloThread extends Thread {
    
        public void run() {
            System.out.println("Hello from a thread!");
        }
    
        public static void main(String args[]) {
            (new HelloThread()).start();
        }
    
    }