我正在使用套接字和线程,但有一个我不明白的问题。 在accept()之后,我调用线程(使用通过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;
}
}
}
答案 0 :(得分:1)
这是正常现象。关闭流将关闭基础流。
如果要保持SocketInputStream打开,则不应关闭ObjectInputStream。