Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何关闭2个线程使用的inputStream_Java_Sockets_Stream - Fatal编程技术网

Java 如何关闭2个线程使用的inputStream

Java 如何关闭2个线程使用的inputStream,java,sockets,stream,Java,Sockets,Stream,我有两个线程-一个用于接收消息,第二个用于接收和发送消息 PrintStream os = new PrintStream(sock.getOutputStream()); BufferedReader is = new BufferedReader(new InputStreamReader(sock.getInputStream())); ServerThread server = new ServerThread(sock, maxid, os,is); OutputThread out

我有两个线程-一个用于接收消息,第二个用于接收和发送消息

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,但如何在两个线程中同时关闭这两个呢?我在
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();
    }
}
看 这可用于线程在其中一个关闭流之前互相等待。

查看
这可用于线程在其中一个关闭流之前互相等待。

您的线程正在从外部源接收is和os,因此关闭流的责任应由外部实体承担。不要在螺纹内关闭它们。在创建流的地方进行外部处理。

您的线程从外部源接收is和os,因此关闭流的责任应由外部实体承担。不要在螺纹内关闭它们。在创建消息的地方进行外部处理。

将代码张贴在试图关闭消息的地方。首先,将close()方法移到finally块。“一个用于接收消息,另一个用于接收和发送消息”。那么你已经有了比你现在意识到的更多的问题。您无法控制哪个线程接收什么。您必须修改此体系结构。如果两个线程之间没有非常精细的同步,它就无法工作,而使用单个读取线程和内部队列则更容易实现同步。可能您根本不需要只读线程。将代码张贴在您试图关闭它们的位置。首先,将close()方法移到finally块。“一个用于接收消息,另一个用于接收和发送”。那么你已经有了比你现在意识到的更多的问题。您无法控制哪个线程接收什么。您必须修改此体系结构。如果两个线程之间没有非常精细的同步,它就无法工作,而使用单个读取线程和内部队列则更容易实现同步。可能您根本不需要只读线程。