不了解线程构造函数、start 和 运行 方法的输出顺序
Don't understand output order of thread constructor, start and run methods
为什么这段代码总是打印这个?
in start oops
in ctor oops
即使线程已经启动,也不调用 run
方法。当线程首先启动时调用 start 方法然后 运行。
class MyThread extends Thread {
public MyThread(String name) {
this.setName(name);
start();
System.out.println("in ctor " + getName());
}
public void start() {
System.out.println("in start " + getName());
}
public void run() {
System.out.println("in run " + getName());
}
}
class Test {
public static void main(String []args) {
new MyThread("oops");
}
}
这是因为 Thread.start 被覆盖并且从未被实际调用。尝试添加 super.start();至 MyTread.start
首先,您还没有启动 Thread
,而是刚刚创建了 class MyThread 的一个实例,它扩展了 Thread
.
要启动方法,您需要从 Thread
class 调用 start()
方法。在这里你已经覆盖了方法但没有从 super class 调用实际的方法。所以你需要将其修复为:
public class Test {
public static void main(String[] args) {
Thread myThread = new MyThread("oops");
myThread.start();
}
}
class MyThread extends Thread {
public MyThread(String name) {
this.setName(name);
this.start();
System.out.println("in ctor " + getName());
}
public void start() {
super.start();
System.out.println("in start " + getName());
}
public void run() {
super.run();
System.out.println("in run " + getName());
}
}
附带说明一下,您应该始终更喜欢实施 Runnable
(或 Callable
)来满足多线程要求。
为什么这段代码总是打印这个?
in start oops
in ctor oops
即使线程已经启动,也不调用 run
方法。当线程首先启动时调用 start 方法然后 运行。
class MyThread extends Thread {
public MyThread(String name) {
this.setName(name);
start();
System.out.println("in ctor " + getName());
}
public void start() {
System.out.println("in start " + getName());
}
public void run() {
System.out.println("in run " + getName());
}
}
class Test {
public static void main(String []args) {
new MyThread("oops");
}
}
这是因为 Thread.start 被覆盖并且从未被实际调用。尝试添加 super.start();至 MyTread.start
首先,您还没有启动 Thread
,而是刚刚创建了 class MyThread 的一个实例,它扩展了 Thread
.
要启动方法,您需要从 Thread
class 调用 start()
方法。在这里你已经覆盖了方法但没有从 super class 调用实际的方法。所以你需要将其修复为:
public class Test {
public static void main(String[] args) {
Thread myThread = new MyThread("oops");
myThread.start();
}
}
class MyThread extends Thread {
public MyThread(String name) {
this.setName(name);
this.start();
System.out.println("in ctor " + getName());
}
public void start() {
super.start();
System.out.println("in start " + getName());
}
public void run() {
super.run();
System.out.println("in run " + getName());
}
}
附带说明一下,您应该始终更喜欢实施 Runnable
(或 Callable
)来满足多线程要求。