Java 在一个新线程上调用run()和start()的区别是什么,而实际上这两个()都产生了一个新线程?

Java 在一个新线程上调用run()和start()的区别是什么,而实际上这两个()都产生了一个新线程?,java,multithreading,concurrency,runnable,Java,Multithreading,Concurrency,Runnable,因此,这个问题之前(和)已经得到了回答,答案对我来说完全有意义: run()。因此,run()方法中的代码实际上是在调用它的同一线程上执行的。 另一方面,start()将线程实例交给调度程序,并在那里调用run(),因此它生成一个新线程,在该线程上执行run()方法的代码 然而,我正在努力真正理解这是什么意思,因此我开发了一个案例来验证这些陈述: public class Test extends Thread{ public void run() { System.o

因此,这个问题之前(和)已经得到了回答,答案对我来说完全有意义:

run()。因此,
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
您正在对线程对象调用getName(),您希望得到什么?当然,您将获得该线程对象的名称。仅此线程不是您当前操作的线程,例如:

Test t = new Test();
t.getName(); // What do you think you'll get?
我假设您想知道的答案是
Thread.currentThread().name()


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

线程API有一个非常常见的陷阱:无法区分线程和类实例。这两个概念完全不同:线程甚至不是对象,而是执行代码的系统资源。另一方面,
线程
只是一个普通的Java对象,它碰巧有一些神奇的方法,最神奇的是。许多其他方法只是普通的旧Java方法,它们属于特定的
线程
实例


就是这样一个方法,它返回调用它的
实例的名称,另一方面,是一个静态方法,它返回负责当前线程的
Thread
实例。这是您要在其上调用的实例,无论哪个线程正在执行测试对象的run方法,在测试对象上调用getThread都会返回分配给该线程对象的名称

如果修复代码,以便始终获得当前线程的名称:

public class Test extends Thread{

    public void run() {
        System.out.println("run() called on thread: " + Thread.currentThread().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();
    }
}
main() called on thread: main
run() called on thread: Thread-5
然后得到的结果显示start使用了不同的线程:

public class Test extends Thread{

    public void run() {
        System.out.println("run() called on thread: " + Thread.currentThread().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();
    }
}
main() called on thread: main
run() called on thread: Thread-5
和run使用相同的线程:

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

可能的副本请仔细阅读问题!我指的是可能的副本,但我扩展它,并要求澄清具体情况@如果你想要
Thread.currentThread().getName()
-
run
只是一个普通的方法,没有任何东西可以确保
这个
是当前线程。@sotirios感谢链接:)顺便说一句
currentThread
上的文档只会进一步混淆!这是Java早期的典型写法。“当前正在执行的线程对象”是什么??