Android アプリケーションで実行可能なスレッド サブクラス オブジェクトを生成する Java ThreadFactory 実装があります。このアプリケーションでは、特定のイベントが発生する前に生成されたすべてのスレッドがアドレス指定可能であり、そのイベントの起動時に、生成されたスレッドがガベージ コレクションの対象になる (参照カウント 0 など) 必要があります。最初の要件を満たすには、スレッド オブジェクトの ArrayList を維持するだけで、うまく機能すると考えていました。問題は 2 番目の要件に伴い、Java 参照カウントに関する一連の質問につながりました。
質問 1: 生成されたスレッドへの参照を ArrayList または他のコンテナーに格納するだけで、各スレッド オブジェクトの参照カウントが増加しますか? 各スレッド オブジェクトの参照カウントは、それらを保存せずに、ファクトリがそれらを作成し、以下のように定義されたハンドルなしで実行できるようにした場合はどうなりますか?
mvThreadSource.newThread(new BackgroundThread(...)).run();
質問 2: 以下のコード サンプルは、hTempThread が指す実際のスレッド オブジェクトに対して、その参照カウントをインクリメントしてすぐにデクリメントする以外に何かを行いますか?
BackgroundThread hTempThread;
for(int i=0;i<mvThreadsVector.size();i++){
hTempThread = mvThreadsVector.get(i); //probably increments ref count of thread
hTempThread = null; //probably just decrements the ref count of thread back to
//previous value
}
質問 3: 質問 2 に対する答えが「いいえ」であると仮定すると、スレッドの参照カウントを必要に応じて 0 に減らすことができるように、ThreadFactory 実装によって生成されたスレッドを格納する効果的な方法は何ですか? これらの参照を削除するための適切な構文は何ですか? 以下のコード サンプルは、関連するすべてのオブジェクト (mvThreadsVector、tempThreads、mvThreadsVector によって追跡される各スレッド オブジェクト) の参照カウントを効果的に 0 に減らしますか? clear() は arraylist に格納されたオブジェクトの参照カウントに対して正確に何を行い、配列参照を null に設定すると内部に格納された要素の参照カウントに対して何を行うのでしょうか?
Object[] tempThreads = mvThreadsVector.toArray();
mvThreadsVector.clear(); //possible this line is all I need...
mvThreadsVector = null;
for(int i=0;i<tempThreads.length;i++){
tempThreads[i] = null;
}
tempThreads = null;
上記の質問のいずれかまたはすべてについての助けをいただければ幸いです。