如果主() 方法通过线索启动, 为什么不运行( ) 出现在职业等级的顶端?
正如其他人提到的那样,这是因为“ 主线”是特殊的。 它不是通过标准 < code> Thread code> 类机制启动的,而是通过 Java 靴套套件代码启动的。 < code> 公共静电无效主线( string[ ] args) 总是由本地代码的主线运行 。
另一个解释是,实际上也许有一种 run ()
un () ) 方法,但是他们建立书架框架的方式是故意隐藏它,以免混淆用户。例如,既然你正在做一个 new Thread( new Test ())
类,那么你的 Test
类实际上是 目标
字段。当背景 Thread
启动时,它实际上称为 Thread.run ()
, 代码中有代码:
public void run() {
if (target != null) {
target.run();
}
}
但我们从未在书架框中看到过 Thread. run ()
方法, 尽管似乎应该存在。 run ()
方法 将 放在书架框中, 如果用户在超级类 < code> Thread 中将其压倒的话。 它可以被 JDK 移除, 以改善书架框架输出 。
Java 中的多行是通过定义运行 () 和引用启动 () 完成的。
这是正确的,但对于后代来说,我认为重要的是要认识到您的代码有问题。您的 Test
类应该 not 来扩展 Thread
,但应该执行 Runnable
。因为 Thread
执行 Runnable
,所以有效。因为 Thread
执行 。
您要么执行 < code> Runnable , 并将您的代码更改为类似 :
public class Test implements Runnable {
public static void main(String[] args) throws Exception {
new Thread(new Test()).start();
throw new RuntimeException("Exception from main thread");
}
public void run() {
throw new RuntimeException("Exception from child thread");
}
}
或者您仍然扩展 < code> Thread , 并改变您开始线条的方式, 将线条切换为以下类型。 推荐上述 < code> Runnable code> 模式, 因为它允许您的 < code> 测试 code> 线条在必要时扩展另一类 。
public class Test extends Thread {
public static void main(String[] args) throws Exception {
new Test().start();
throw new RuntimeException("Exception from main thread");
}
@Override
public void run() {
throw new RuntimeException("Exception from child thread");
}
}
为什么这很重要? 您当前的代码实际上是 obtiates 2 < code> Thread 对象, 但其中只有一个是 < code> start () , 并且以背景 < code> Thread 运行。 您可以有以下的错误 :
public class Test extends Thread {
public static void main(String[] args) throws Exception {
Test test = new Test();
new Thread(test).start();
// this is not interrupting the background thread
test.interrupt();