これは、ソケット経由のサーバークライアントのネットワーク化を伴います。クライアントスレッドはwhile(boolean)
ループで実行されています。これはClientBeanクラスからアクセスされ、条件はfalseに設定されます。スレッドを停止するか、終了する必要があります。しかし、私はスレッドの実行のループの条件をfalseに設定した後、スレッドのInputStreamをもう一度読み取ろうとしています。 SocketExceptionがスローされます。スレッドは終了後にもう一度実行されます
Beanのコードの一部: -
public void disconnect() {
client.setSendMessage(key + "disconnect");
thd.setRunning(false);
client.setRunning(false);
try {
client.getSock().close();
inputDisabled = sendBtnDisabled = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
とスレッドのrun()メソッド: -
public void run() {
while (running) {
try {
if (!sock.isClosed())
if ((receiveMessage = receiveRead.readLine()) != null) {
msg = receiveMessage;
}
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
私はラインif ((receiveMessage = receiveRead.readLine()) != null)
上の例外を取得します。 スレッドが停止した後、run()のループがもう一度実行されるのはなぜですか?さらに、私はbeanからソケットを閉じたときに、どのようにして条件if (!sock.isClosed())
を満たしていますか?
'running'はvolatileですか?たぶん、スレッドはまだそれを「真」と見なします。 – Marvin
スレッドとソケットに関するより多くのコードを提供する必要があります。完全なスタックトレース。 –
いいえ、それは揮発性ではありません。 –