请参阅ThreadPoolExecutor的Worker类
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
{
final Thread thread;
Runnable firstTask;
volatile long completedTasks;
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}
/** Delegates main run loop to outer runWorker */
public void run() {
runWorker(this);
}
}
这是ThreadPoolExecutor类中的一些代码段
private boolean addWorker(Runnable firstTask, boolean core) {
boolean workerStarted = false;
boolean workerAdded = false;
Worker w = null;
try {
w = new Worker(firstTask);
final Thread t = w.thread;
...
}
}
我通过Google了解到Thread是一个gc root,worker依赖于线程对象,而线程也依赖于worker。当线程运行时,如果工作人员将被回收,我知道,只有当对象相对于gc root无法访问时才会被标记,工作人员如何确定应该标记工作人员进行回收。否则,在线程运行时工作程序将不会被回收?
在JVM的生命周期中只有一个垃圾收集器。
考虑阅读此Java Garbage Collection Basics以获取有关GC的更多信息。
更新:
你写: “工作者依赖于线程对象,线程也取决于工作者”。
那么如果你可以在任何时候到达它们(这意味着对象仍然可以使用),GC如何能够移除它们中的任何一个?
对象将保留在内存中,直到它们无法访问。
因此,在您的情况下,只有当线程和工作程序从根目录无法访问时,它们才会被垃圾收集。