究竟什么时候 Callable 传递给 ExecutorService 可用于垃圾收集
When exactly is a Callable passed to an ExecutorService available for garbage collection
我有一个 8 线程池,我给它大约 100 个 class 实现 Callable
的实例,即 WorkerThread
for (List<String> s : listOfLists) {
Future<?> future = executor.submit(new Worker(hugeList));
}
for (Future<?> f : futures) {
try {
String result = (String) f.get();
} catch (InterruptedException e) {
logger.error("Interrupted", e);
} catch (ExecutionException e) {
logger.error("Execution exception", e);
}
}
executor.shutdown();
传递给执行程序的实例何时有资格进行垃圾回收?一旦 f.get() 被执行,它们是否符合垃圾收集的条件,或者所有 new Worker(hugeList)
将保留在内存中,直到 executor.shutdown()
被调用。
每个 new Worker()
都非常大,我希望它们在各自的线程执行后被垃圾回收。但我不确定他们什么时候有资格这样做。
除非 callable 的结果引用了 callable 本身,一旦任务被执行,它就不会被任何东西引用,因此符合 GC 的条件。
池是一个队列,任务在其中等待执行,一组线程将任务从队列中取出并执行。一旦执行,池就不再关心任务,也不会把它们保存在任何地方。
我有一个 8 线程池,我给它大约 100 个 class 实现 Callable
的实例,即 WorkerThread
for (List<String> s : listOfLists) {
Future<?> future = executor.submit(new Worker(hugeList));
}
for (Future<?> f : futures) {
try {
String result = (String) f.get();
} catch (InterruptedException e) {
logger.error("Interrupted", e);
} catch (ExecutionException e) {
logger.error("Execution exception", e);
}
}
executor.shutdown();
传递给执行程序的实例何时有资格进行垃圾回收?一旦 f.get() 被执行,它们是否符合垃圾收集的条件,或者所有 new Worker(hugeList)
将保留在内存中,直到 executor.shutdown()
被调用。
每个 new Worker()
都非常大,我希望它们在各自的线程执行后被垃圾回收。但我不确定他们什么时候有资格这样做。
除非 callable 的结果引用了 callable 本身,一旦任务被执行,它就不会被任何东西引用,因此符合 GC 的条件。
池是一个队列,任务在其中等待执行,一组线程将任务从队列中取出并执行。一旦执行,池就不再关心任务,也不会把它们保存在任何地方。