0

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;

上記の質問のいずれかまたはすべてについての助けをいただければ幸いです。

4

1 に答える 1

1
  1. スレッドを実行している場合、実行が終了するまでメモリに保持 (またはスワップ) されますが、GC には保持されません。スレッドにそれを参照するコードがなく、コードを実行している場合でも、少なくとも内部的に参照があります。

  2. 参照カウントをインクリメントおよびデクリメントすることさえ保証できません。コンパイラーは、最初の代入が効果がないことを認識して (すぐに上書きされるため) 最適化し、それを削除する場合があります。

  3. 参照カウントは減少しますが、参照チェーンにループが存在する可能性があることに注意してください。各要素には 1 つの参照カウントがありますが、ループ全体にアクセスできないため、正しい GC はそれを認識して削除する必要があります。

主な問題は、スレッドの参照カウントが 0 になることを期待してはならないことだと思います。それらが実行されている限り、参照があると想定する必要があるため、スレッドが実行を停止することを確認する方法も必要です。

于 2013-01-30T00:22:10.723 に答える