JAVA の input output をクローズするタイミングについて。


すいません、in out についての質問なんですが、
============================
public class player_receive extends Thread {

private int size;
private String msg;
private Socket socket;
byte[] w=new byte[10240];

public String getplayer_receive(){
return msg;
}

public player_receive(Socket socket) {
this.socket=socket;
}

public void run(){

while( true ){

try {

java.io.InputStream in = socket.getInputStream();
size=in.read(w);
msg=new String(w,0,size,"UTF8");
// in.close();

if ( msg != null ) {
break;
}

} catch (IOException e) {
}

}

}

}
============================
上のようなあるソケットから文字列を受け取るスレッドを作りました。

getplayer_receive()
を使って文字列をうけとるやつで
// in.close();
をコメントアウトしています。これだとうまくいきます。

in.close();

のコメントを外すと止まります。

うけとったときに msg に格納しているのでinは不要だと思うのですが、なぜでしょうか?

inをずっとクローズせずに、このスレッドをどんどん量産していった場合、どうなるでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/08/22 17:24:27
  • 終了:2013/08/29 17:25:05

回答(2件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492013/08/22 17:35:49

クローズすべきは接続部分なのでin.close()ではなくsocket.close()

id:kenichiice No.2

kenichiice回答回数48ベストアンサー獲得回数72013/08/23 01:31:47

のコメントを外すと止まります。


Socket#getInputStream() の説明

http://docs.oracle.com/javase/jp/7/api/java/net/Socket.html#getInputStream%28%29

に、「返されたInputStream をクローズすると、関連付けられたソケットがクローズします。」とあります。

従って、ご提示のコードで「in.close();」を生かすとそこでsocketオブジェクトがクローズされ、それにより次の「java.io.InputStream in = socket.getInputStream();」の所でIOExceptionが投げられ、無限ループしてしまうのではないでしょうか。

inをずっとクローズせずに、このスレッドをどんどん量産していった場合、どうなるでしょうか?


inはクローズしなくても問題ないように見えますが、socketは適切なタイミングでクローズする必要があると思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません