Java 两行代码的功能

Java 两行代码的功能,java,multithreading,Java,Multithreading,我正在学习Java中的线程。我想知道以下两段代码是否相同: class B extends Thread { public void run() { doSomething(); } public void doSomething() {} } class A extends Thread { public void run() { new B().start(); } } 第二段代码正在更改A类: class A e

我正在学习Java中的线程。我想知道以下两段代码是否相同:

 class B extends Thread {
    public void run() {
        doSomething();
    }
    public void doSomething() {}
}
class A extends Thread { 
    public void run() {
        new B().start();
    }
}
第二段代码正在更改A类:

class A extends Thread {
        public void run() {
            new B().doSomething();
        }
}

当我阅读团队项目的代码时,我发现了这个问题:一个线程调用另一个没有循环的线程。

在第一个代码片段中,您实际上是在创建一个新线程,而doSomething()的调用是在一个单独的线程中运行的run()方法


在第二个代码段中,您正在运行A的上下文(线程)中执行B的doSomething()

正如你的问题所表明的,这两种情况并不相同

假设在每种情况下,我们都通过调用
newa().start()
来输入代码,那么第一个示例启动一个线程(A),该线程启动另一个调用
doSomething()
的线程(B)


第二种情况启动单个线程(a),该线程调用
B.doSomething()
。在本例中,我们不启动类型为B的线程,因为我们从不在B的实例上调用
.start()

不清楚您编写的最后一行是什么意思。它们是最后一行line@eznmeif它们是最后一行,结果将是相同的?在这两种情况下,
doSomething()
将被调用一次,因此,明显的结果将是相同的,但启动的线程数将不同。这就是你的意思吗?第二个更好吗?可能-它更有效,因为它不会启动不必要的线程。但是,您可以通过将
doSomething()
移动到A中,并完全删除B来进一步简化。