Adwaitクマール:
与えられたコードで、例えば、
@Singleton
public class MyExecutor {
ExecutorService executorService;
public void execute(Runnable runnable) {
executorService.submit(runnable);
}
}
class A {
public void a(String x) {
// do something
}
MyExecutor executor;
// Injected via DI, always is same object
A(MyExecutor executor) {
this.executor = executor;
}
public void run() {
executor.execute(() -> a("Whatever"));
}
}
私の質問は、私が作成していたとしているので、A
非常に頻繁にSを、その呼び出しをa.run()
し、それを忘れ、私の意志A
までオブジェクトがGCによって収集されていないMyExecutor
彼らと完成処理を持っていますか?
ケースである必要があり、他の賢明な方法がします私には思えるMyExecutor
、これまでに実行するためにどのインスタンスを知っていますか?
だから、基本的に私の質問は、呼び出し元オブジェクトとしてインスタンスメソッドの参照を渡すんさRunnable
/ Callable
/ Consumer
まで..etcもGCの安全渡さRunnable
/ Callable
/ Consumer
誰かが彼らへの参照を保持していますか?
GhostCat敬礼モニカC.:
承知しました。
それは非常に簡単です:「アクティブ」オブジェクトは他のオブジェクトXは、ガベージコレクションのeligbleではないことを、いくつかの他のオブジェクトXへの参照を保持する限り。
そしてexecutorがそれに提出されたすべてのタスクを追跡することを想定しても安全です。タスクが終了すると、それに渡された実行可能なタスク/への言及は...もはや必要ありません。それについてのエグゼキュータの忘れそう、そしてその後、タスク/実行可能にGCの対象になるという。
ノートを喜ば:なし「メソッド参照」オブジェクトが存在しません!方法の参照またはラムダは、基本的に(例えば、文脈に応じて、タスクまたはRunnableを)いくつかのクラスのオブジェクトです。メソッドの参照は、すべての最初のものであるシンタックス要素!