线程突然停止,没有异常或错误消息

时间:2012-06-17 13:48:44

标签: java multithreading network-programming

我有一个读取和写入网络套接字的线程。

public void run() {
    try {
        Socket socket = new Socket("10.0.1.11", 19456);
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String message = "13" + seperator + "0" + seperator + "userdata";
        out.write(message);
        out.flush();

        while (listen) {
            String input = "";

            for (int letter = in.read(); letter != -1; letter = in.read()) {
                System.out.println((char)letter);
                input += (char)letter;
            }

            System.out.println(input);
            displayText(input);
        }

        socket.close();
    } catch (UnknownHostException e) {
        displayText("Could not connect to server!");
    } catch (IOException e) {
        displayText("Could not open IO to server!");
    }
}

但是,不执行for循环之后的所有内容。 for循环中的System.out.println打印出它应该的所有字母,但for循环之后的System.out.println和displayText函数永远不会被执行(用断点检查)...我错过了什么这里? :S

2 个答案:

答案 0 :(得分:3)

根据http://www.docjar.com/docs/api/java/io/Reader.html#read

This method will block until a character is available,
an I/O error occurs, or the end of the stream is reached.

他们的代码示例确实显示他们在EOF上返回-1。

所以,你的for循环是阻塞的,因为 in.read()无法识别EOF条件。

在套接字服务器关闭其发送方向之前它不能这样做,这会关闭客户端的接收端。

答案 1 :(得分:0)

  1. 在调试器中启动程序
  2. 重现错误
  3. 检查线程是否仍然存在(在eclipse中,调试视图列出了所有进程,其中的线程)
    • 如果线程存在:暂停它(在eclipse中,通过单击线程并按暂停图标)。调试器现在将显示该线程的堆栈,因此您可以检查它正在做什么。
    • 如果该线程不再存在,则必须正常或突然终止(由于未处理的异常)。您可以通过在run()中的最后一个语句上设置断点来区分它。如果它突然完成,则必须调用线程的未捕获异常处理程序。