1

私には2つのスレッドがあります。1つはメッセージの受信用で、もう1つは受信と送信の両方用です。

PrintStream os = new PrintStream(sock.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(sock.getInputStream()));

ServerThread server = new ServerThread(sock, maxid, os,is);
OutputThread out = new OutputThread(sock, maxid, os,is);

次に、接続を閉じるときに、isとosを正しく閉じたいのですが、2つのスレッドで両方を行うにはどうすればよいですか?入るjava.net.SocketException_ServerThread

public ServerThread(..){
    try{
          //here I use is and os

} finally {
        disconnect();
    }
}

public void disconnect() {
    try {
        System.out.println(addr.getHostName()+ " disconnected");
        os.close();
        try {
            is.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } finally {
        this.interrupt();
    }
}
4

2 に答える 2

1

スレッドは外部ソースからisとosを受信して​​いるため、ストリームを閉じる責任は外部エンティティにある必要があります。スレッド内でそれらを閉じないでください。それらが作成された場所で外部的に処理します。

于 2012-05-23T09:35:24.143 に答える
0

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.htmlを参照してください。 これは、スレッドの1つがストリームを閉じる前にスレッドが互いに待機するために使用できます。

于 2012-05-23T09:32:03.957 に答える