使用套接字和线程的一个问题

时间:2019-05-24 15:50:34

标签: java multithreading sockets

我正在使用套接字和线程,但有一个我不明白的问题。 在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;
        }       
    }
}

1 个答案:

答案 0 :(得分:1)

这是正常现象。关闭流将关闭基础流。

如果要保持SocketInputStream打开,则不应关闭ObjectInputStream。