线程 class 完成 运行 方法后的实例

Thread class Instance after completion of run method

我正尝试在 Java 中学习多线程。我们使用两种方法来创建线程,第一种是通过扩展 Thread class,第二种方法是通过实现 Runnable 接口。

在下面的示例中,我通过实现 Runnable 接口创建了一个线程。


class ThreadExample implements Runnable {

    @Override
    public void run() {
        System.out.println("run method is called by thread named " + Thread.currentThread().getName());

        System.out.println("run method is ending for thread named " + Thread.currentThread().getName());

    }

}

public class TestInterruptingThread2 extends Thread {

    public static void main(String args[]) {
        ThreadExample threadExample = new ThreadExample();
        Thread thread = new Thread(threadExample);
        thread.start();

    }
}

输出为-

run method is called by thread named Thread-0
run method is ending for thread named Thread-0

如上例所示,要创建 ThreadExample class 的线程,我们首先创建其对象,然后将其传递给 Thread 的构造函数 class .

我的问题是,在运行()方法完成后,Thread的实例发生了什么class到[=的哪个对象26=]ThreadExample class 对象被传递。它是否符合垃圾收集条件?

以及通过实现 Runnable 接口创建线程比通过扩展 Thread 创建线程的内存效率如何 class?

Does it become eligible for garbage collection?

是的。当一个 Thread 实例终止并且所有其他对该对象的引用丢失时,它将变得无法访问并且将成为垃圾收集的候选对象。

请注意,通常会在垃圾收集器运行之前回收线程的堆栈。 (由线程终止触发。)


How creating thread by implementing Runnable interface is more memory efficient than by extending Thread class?

这不是真正的问题。

不扩展 Thread 性能相关 原因源于以下事实:创建并启动一个 Thread 或 class 派生自 Thread 很贵。 (在某些平台上,它可能需要一毫秒的时间!)所以你想避免重复创建新的 Thread 对象。

执行此操作的标准方法是使用线程池或 ExecutorService。这些通过将任务封装为 Runnable(或 Callable)并将其传递给长 运行 工作线程/池线程来工作。这样的线程通常会在其生命周期内处理大量这些任务(一次一个),因此线程创建的成本在多个任务上 摊销 ... 并成为微不足道。

这与 new Thread(Runnable)extends Thread 有什么关系?

在前一种情况下,您已经将任务封装为 Runnable,因此将应用程序转换为使用线程池/执行程序相对简单。相比之下,如果扩展 Thread,则必须更改更多代码。

现在...您可以为您的自定义线程实施一个线程池class。然而,典型的线程池实现有一些复杂的逻辑和线程安全问题,所以这是一个坏主意。


扩展 Thread 也是一个坏主意还有其他原因。但是您只是询问与性能相关的原因。