作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,这个问题之前已经回答过(here 和 here),答案对我来说完全有意义:
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/
我是一名优秀的程序员,十分优秀!