オブジェクトへの参照がない場合にのみ、オブジェクトはガベージコレクションの対象になります。someThreadに格納されている値にアクセスする必要があると言います。myObjつまり、への参照が必要です。これは、資格がない限り、ガベージコレクションの資格がないことを意味します。myObjmyObjsomeThread
オブジェクトがあなたの下からガベージコレクションされないことを保証できるので、たとえば、これは完全に安全です。
void foo() {
final Object something = new String("I'm alive!");
new Thread() {
public void run() {
try {Thread.sleep(10000);} catch (InterruptedException e) {}
System.out.println(something);
}
}.start();
}
somethingは匿名スレッドによって参照されるため、匿名スレッドが完了するまでガベージコレクションの対象にはなりません。
より具体的にあなたの例では、これも安全です:
void foo() {
new ThreadStartingObject("I'm alive!");
}
class ThreadStartingObject {
private String message;
public void ThreadStartingObject(String msg) {
this.message = msg;
new Thread() {
public void run() {
try {Thread.sleep(10000);} catch (InterruptedException e) {}
System.out.println(message);
}
}.start();
}
}
スレッドを表す匿名の内部クラスには、外部への暗黙の参照this、つまりのインスタンスがありThreadStartingObjectます。その参照はガベージコレクションを防ぎます。