0

私はJavaでチャットサーバーを書いています。実行可能なクラスの固定配列を使用していました。配列内の各要素はクライアントを表します。作成されたスレッドは、ソケットストリームから読み取る無限ループ内にあります。

今はリストを使ってやりたいので、配列のサイズを気にする必要はなく、より合法的な方法に聞こえます。ただし、アイテムを削除してもスレッドが終了するかどうかはわかりませんでした。実際、私はそれが何をするのか分かりません。また、そのような状況でリストを使用することで他に考えられる問題があるのではないかと思います。最後に、タイマーの配列はどうですか?クライアントごとにタイマーを使用したので、タイマーリストからタイマーを削除するとスケジュールも停止しますか?考えられる問題はありますか?

4

4 に答える 4

1

オブジェクトはそれ自体に存在します。そのオブジェクトへの参照をリストに保存しても、その動作は変わりません。

したがって、スレッドで実行されているRunnableタスクがある場合、それをリストに追加/リストから削除しても、そのRunnableに違いはなく、スレッドは引き続き実行します。

同じことがタイマーやその他のオブジェクトにも当てはまります。

補足:リストからオブジェクトを削除すると違いが生じる状況が1つあります。それは、そのオブジェクトがそのリストを介してのみ到達可能である場合です。削除された後は、到達できなくなったため、ガベージコレクションの対象になります。ただし、これは実行中のスレッドやアクティブなタイマーには適用されません。

于 2012-08-12T18:57:47.733 に答える
1

スレッドオブジェクトがあります。それへの参照が配列に挿入されました。配列(つまりスレッド)から参照を追加または削除しても、未知の副作用は発生しないため、問題ありません。スレッドを停止したい場合は、runメソッドの内部でそれを実装する必要があります。ここではガベージコレクションは問題ではありません。

タイマーも同じ問題です。これらはすべてオブジェクト参照です。

于 2012-08-12T18:58:37.350 に答える
1

実行中のスレッドは、いわゆるガベージコレクションルートと見なされます。ルートであるか、ルートから(間接的に)参照できるものはすべてガベージコレクションされません。ガベージコレクターがオブジェクトが「到達可能」であるかどうかを判断する場合、ガベージコレクターのルートのセットを参照ポイントとして常に使用します。

于 2012-08-12T19:00:02.147 に答える
0

ねえ、私はこの質問を参照します!

スレッドが開始された場合、それは含まれているスレッドによって参照されるため、ガベージコレクションされません。

実行されているか、まだ開始されていない場合は、ガベージコレクションされます。

この理由は、開始時にスレッドオブジェクトが現在のオブジェクトに追加されThreadGroup(内部ではもう少し複雑になります:))、完了すると自動的に削除されるためです。

于 2012-08-12T18:59:05.400 に答える