gpt4 book ai didi

java - 当 run() 和 start() 实际上都产生一个新线程时,在新线程上调用 run() 和 start() 究竟有什么区别?

转载 作者:行者123 更新时间:2023-12-02 05:33:03 24 4
gpt4 key购买 nike

所以,这个问题之前已经回答过(herehere),答案对我来说完全有意义:

run()只需调用 run() Thread 的方法对象,但没有生成新线程。所以,run() 中的代码方法实际上是在调用它的同一个线程上执行的。 start()另一方面将线程实例移交给调度程序并调用 run()在那里,所以它生成一个新线程run() 的代码在该线程上方法被执行。

但是,我很难真正理解这是什么意思,所以我开发了一个案例来验证这些陈述:

public class Test extends Thread{

public void run() {
System.out.println("run() called on thread: " + getName());
}

public static void main(String[] args) throws Exception {
System.out.println("main() called on thread: " + Thread.currentThread().getName());
Test t = new Test();
t.start(); // OR t.run();
}
}

所以,如果以上是真的,程序的输出应该是线程的名称应该是相同的,如果我使用 t.run()执行 print 语句,因为不应创建新线程并且 t只是在创建它的同一线程上运行。另一方面,t.start()实际上应该给我两个不同的线程名称。

但是,在这两种情况下我都得到了输出:

main() called on thread: main
run() called on thread: Thread-0

谁能解释为什么调用t.run()还会产生一个新线程,但实际上并不输出:

main() called on thread: main
run() called on thread: main

最佳答案

您正在 Thread 对象上调用 getName(),您期望什么?当然,您将获得该 Thread 对象的名称。只有那个不是你当前操作的线程,例如:

Test t = new Test();
t.getName(); // What do you think you'll get?

我假设你想知道的将由 Thread.currentThread().name();

回答

让我改一下:您不是在问“给我运行此方法的当前线程的名称”,而是“给我调用此方法的线程对象的名称”。 - 这是不一样的。

关于java - 当 run() 和 start() 实际上都产生一个新线程时,在新线程上调用 run() 和 start() 究竟有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29241337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com