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 作为参数。
您将实现 Runnable
的 class
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:
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();
}
}
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();
}
}
有人可以解释这段代码的作用吗? 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 作为参数。
您将实现 Runnable
的 class
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:
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(); } }
实现Subclass Thread
。 Thread class 本身实现了Runnable
,尽管它的 运行 方法什么都不做。应用程序可以子 classThread
,提供自己的 运行public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new HelloThread()).start(); } }