The Thread
类是本机内存中真实线程的代理。
我希望我的假设是正确的,一旦线程完成其 run() 方法,它就有资格进行垃圾收集。
run()之后实际上还有一段代码,这段代码处理未捕获的异常。
一旦线程终止,其本机内存和堆栈将立即释放,无需 GC。但是,那Thread
对象就像任何其他对象一样,它会一直存在,直到 GC 决定它可以释放为止,例如没有强有力的参考。
类似地,FileOutputStream 是操作系统中文件的代理。即使文件已被删除,您仍然可以引用该对象close()
甚至删除。
如果从 run() 返回后它不符合垃圾回收的条件,是否应该将其引用设置为 null 来执行此操作?
您很少需要在任何地方执行此操作。事实上,一开始就不保留对线程的引用,或者使用 ExecutorService 来管理线程通常更简单。
当我有一个对象时Thread
字段 当线程死亡时,我经常让这个对象死亡,因此该字段不需要null
ed out.
我还使用用于 Fork/Join 的内置线程池。这是在后台线程中执行任务的一种更轻量级的方法,因为它不会创建和销毁太多线程。
ExecutorService fjp = ForkJoinPool.commonPool();
符合垃圾回收条件并不一定意味着该对象将从内存中删除。垃圾收集时由底层操作系统/JVM 自行决定。但是如何确保(通过 Java 程序或外部工具)该对象已完全从内存中删除呢?
你不能也不应该尝试。 GC 将在需要时清理资源。
如果一个线程一旦完成其 run() 方法就被认为是死亡的,为什么我仍然能够在同一个线程对象上执行 isAlive() 或 getState() ?两个调用分别返回 false 和 RUNNABLE。
线程对象就像任何其他对象一样。只要您持有对它的引用,就可以调用它的方法。