Почему не умирает поток в java?

266
15 января 2018, 08:39

Добрый день. Разбираю код из книжки (чат клиент). Почему Thread readerThread не завершает своего выполнения? метод run() лежит внизу стека, по идее он должен выполниться и завершить работу, однако все входящие сообщения обрабатываются и выводятся.

public class IncomingReader implements Runnable {
    public void run() {
        String message;
        try {
            while((message = reader.readLine()) != null) {
                System.out.println("read " + message);
                incoming.append(message + "\n");
            }
        } catch(Exception ex) {ex.printStackTrace();}
    }
}

Насколько я понимаю если буфер пуст, то цикл завершается и метод собственно тоже, однако как только приходит сообщение от сервера оно все равно обрабатывается. Полный код:

import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Client {
    JTextArea incoming;
    JTextField outgoing;
    BufferedReader reader;
    PrintWriter writer;
    Socket sock;
    public static void main(String[] args) {
        Client client = new Client();
        client.go();
    }
    public void go() {
        JFrame frame = new JFrame("Chat Client");
        JPanel mainPanel = new JPanel();
        incoming = new JTextArea(15,20);
        incoming.setLineWrap(true);
        incoming.setWrapStyleWord(true);
        incoming.setEditable(false);
        JScrollPane qScroller = new JScrollPane(incoming);
        qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        outgoing = new JTextField(20);
        JButton sendButton = new JButton("Send");
        sendButton.addActionListener(new SendButtonListener());
        mainPanel.add(qScroller);
        mainPanel.add(outgoing);
        mainPanel.add(sendButton);
        setUpNetworking();
        Thread readerThread = new Thread(new IncomingReader());
        readerThread.start();
        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
        frame.setSize(400,500);
        frame.setVisible(true);
    }
    private void setUpNetworking() {
        try {
            Socket sock = new Socket("127.0.0.1", 5000);
            InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
            reader = new BufferedReader(streamReader);
            writer = new PrintWriter(sock.getOutputStream());
            System.out.println("networking established");
        } catch(IOException ex) {ex.printStackTrace();}
    }
    public class SendButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent ev) {
            try {
                writer.println(outgoing.getText());
                writer.flush();
            } catch(Exception ex) {ex.printStackTrace();}
            outgoing.setText("");
            outgoing.requestFocus();
        }
    }
public class IncomingReader implements Runnable {
    public void run() {
        String message;
        try {
            while((message = reader.readLine()) != null) {
                System.out.println("read " + message);
                incoming.append(message + "\n");
            }
        } catch(Exception ex) {ex.printStackTrace();}
    }
}
}
READ ALSO
Знаки вопроса вместо кириллицы в JSON

Знаки вопроса вместо кириллицы в JSON

ЗдравствуйтеМеня интересует как можно решить проблему с отображением знаков вопроса вместо кириллических символов в JSON полученном Ajax-запросом

272
NetworkOnMainThreadException rxjava

NetworkOnMainThreadException rxjava

Есть такой код

215
Не могу пропарсить сайт

Не могу пропарсить сайт

Результат 0, пожалуйста помогите

253