メソッド内でローカル スレッドを宣言するとどうなるのだろうか。通常、ローカル変数はすべてスタックに割り当てられているため、関数が戻るとすぐにすべてなくなります。ただし、ローカル スレッドは別の話になるようです。そうですか?
public int A() {
Thread t = new Thread() {
doSomething();
}
t.start();
return -1;
}
メソッド内でローカル スレッドを宣言するとどうなるのだろうか。通常、ローカル変数はすべてスタックに割り当てられているため、関数が戻るとすぐにすべてなくなります。ただし、ローカル スレッドは別の話になるようです。そうですか?
public int A() {
Thread t = new Thread() {
doSomething();
}
t.start();
return -1;
}
ジョンの答えは良いですが、さらに詳細を追加したいと思いました。これは、特定の変数の使用法を示すために使用するコード例です。
public void startThread() {
long var1 = 10;
byte[] var2 = new byte[1024];
final byte[] var3 = new byte[1024];
final byte[] var4 = new byte[1024];
Thread thread = new Thread(new Runnable() {
private long var5 = 10;
private byte[] var6 = new byte[1024];
public void run() {
int var7 = 100;
byte[] var8 = new byte[1024];
System.out.println("Size of var4 is " + var4.length);
baz();
...
}
private void baz() {
long var9 = 2;
byte[] var10 = new byte[1024];
...
}
});
thread.start();
}
したがって、ここではスレッドに割り当てられた多数の変数があります。Thread
オブジェクト自体Runnable
と、スレッドが実行しているターゲットもあります。
startThread()
、関連付けられThread
ている も JVM によって管理されます。run()
メソッドが終了Thread
し、JVM によってリープされた後にのみ GCされます。が GC された後、Thread
によって使用されるすべてのフィールドをThread
GC することができます。Thread
ます。startThread()
あり、スタックに割り当てられています。startThread()
メソッドが終了し、スタックが再利用されると上書きされます。startThread()
あり、ヒープに割り当てられます。ではないため、スレッドでは使用できませんfinal
。終了後にGCすることができますstartThread()
。startThread()
あり、ヒープに割り当てられます。これは、スレッドで使用できるfinal
ようにするためですが、そうではありません。終了後にGCすることができます。startThread()
startThread()
あり、ヒープに割り当てられます。これはfinal
、スレッドによって使用されます。startThread()
メソッドが終了し、Runnable
とが GC された後にのみ GC できますThread
。Runnable
の一部としてヒープに割り当てられた内部のローカル フィールドです。終了Runnable
後に GC することができ、およびが GC されます。Runnable
Runnable
Thread
Runnable
、ヒープに割り当てられた内部のローカル フィールドです。Runnable
終了後に GC することができ、Runnable
およびThread
が GC されます。run()
メソッド内のローカル フィールドであり、新しいスレッドのスタックに割り当てられます。run()
メソッドが終了し、スタックが再利用されると上書きされます。run()
メソッド内のローカル フィールドで、ヒープに割り当てられます。run()
メソッドの終了後に GC できます。baz()
メソッド内のローカル フィールドで、新しいスレッドのスタックに割り当てられます。baz()
メソッドが終了し、スタックが再利用されると上書きされます。baz()
メソッド内のローカル フィールドで、ヒープに割り当てられます。baz()
メソッドの終了後に GC できます。その他の注意事項:
startThread()
。それRunnable
に関連付けられているすべての変数を GC することもできます。final long varX
スレッドでプリミティブを宣言して使用する場合は、スタックではなくstartThread()
ヒープに割り当てる必要があります。終わってもまだまだ使えます。startThread()
変数がプリミティブの場合、スタック上にあり、メソッドが戻ると消えますが、スレッドのRunnable
インスタンス (またはスレッドの肉を含むもの) には、そのプリミティブ値のコピーがあります。
変数が参照型の場合、オブジェクトはヒープに割り当てられ、それへの参照がなくなるまで存続し、その時点でガベージ コレクションの対象となります。そのオブジェクトへの参照はスタック上にあり、メソッドが戻ると消えますが、プリミティブと同様に、スレッドRunnable
には同じ参照のコピーがあります (したがって、そのオブジェクトは生きたままになります)。
run
Thread がローカル コンテキストから開始された場合、スレッドは Runnable のメソッドの実行が完了するまで実行を続けます。