[英]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中创建新线程时,需要给它们做些事情-“可运行”。
class X implements Runnable
此接口只有一个方法-run() 。 因此,您将创建一个新线程,其构造函数中具有可运行的线程。
new Thread(new X())
创建新线程后,必须使用start()方法启动它。 这是当它调用runnable的run()方法时。 在您的示例中,这是在构造线程之后被链接起来的:
new Thread(new X()).start();
现在,此示例很不寻常,因为类X实际上没有实现run方法。 但是通常情况下,还有一些额外的内容,因此您的示例如下所示:
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();
}
}
首先,不需要定义构造函数(如果为空)。 如果您未定义,它将自动为空白。 第二,您可以简单地做一个匿名类定义,我将在稍后解释。 在这种情况下,该方法不是主要方法,它可以运行。 您也可以使用匿名类定义来定义线程对象。
new Thread() {
@Override
public void run() {
//Code here
}
}.start();
匿名类定义允许您定义和实例化一个类,它们同时扩展/实现另一个类,而无需实际创建该类。 另外,请注意X.main()是静态的,这意味着X的任何实例都不会具有该方法。 您要覆盖运行和调用开始。 Start只是一种在不同线程中调用运行的方法。 请注意,您不能两次启动线程。
每个线程对象都有一个方法run()。 如果调用线程对象的start()方法,则它将执行run()。
唯一的区别是它将单独/并行执行,并且不会在现有的操作顺序中执行。
您可以通过两种方式创建线程:一种是通过扩展Thread
,另一种是通过实现Runnable
接口。
如果您不扩展Thread
类,则您的类对象将不被视为线程对象。 因此,您必须显式创建Thread类对象。
Thread
类将Runnable
类作为构造函数中的参数。
您正在将实现Runnable
class
X的对象传递给Thread
构造函数,以便您的类run
()方法将从Thread的start
()方法执行。
您可以通过两种不同的方式创建线程。 看看有关线程创建的 oracle文档
创建Thread实例的应用程序必须提供将在该线程中运行的代码。 有两种方法可以做到这一点:
Provide a Runnable object.
Runnable
接口定义了一个方法run,旨在包含在线程中执行的代码。 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类本身实现Runnable
,尽管其run方法不执行任何操作。 应用程序可以继承Thread
子类,从而提供其自己的run实现
public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new HelloThread()).start(); } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.