Я работаю с сокетами и потоками, и у меня есть проблема, которую я не понимаю.
После accept () я вызываю thread (используя пул, созданный с помощью ThreadPoolExecutor).
Вызываемый поток (waitReplay) действительно получает объект (одна команда), он создает новый ObjectInputStream, затем он что-то делает и, наконец, закрывает ObjectInputStream.
Когда я отлаживаю, я вижу, что закрытие OjectInputStream (ois.close ();) сокет также был закрыт, даже soc.close () не вызывается. Конечно, следующий поток не работает.
Это телефонный код:
try {
Socket client = server.accept(); // accept che va in timeout
while (count.getCount()>0)
pool.execute(new WaitReplay(client, count));
client.close();
accepted = true;
System.out.println("Quorum ragiunto!");
}
И вызываемая нить:
public class WaitReplay implements Runnable {
protected Socket soc;
protected Counter cnt;
public WaitReplay(Socket soc, Counter cnt) {
this.soc = soc;
this.cnt = cnt;
}
public void run() {
ObjectInputStream ois; // input stream
Message msg;
InputStream in;
try {
in = soc.getInputStream();
ois = new ObjectInputStream(in);
msg = (Message) ois.readObject();
System.out.println("Ricevuto: " + msg.getCmd() + ": Quorum " + cnt.getCount());
if (msg.getCmd() == Cmnd.OK) {
cnt.decrement();
}
ois.close();
}
catch (Exception e) {
System.out.println("schiatto dentro waitreply");
e.printStackTrace();
return;
}
}
}