在Runnable对象中停止BufferedReader

时间:2018-01-26 20:31:20

标签: java multithreading sockets

我有一个名为IRCConnection的对象,它实现Runnable并包含Socket。我使用Socket连接到服务器,并在BufferedReader的帮助下阅读输入。 我希望能够停止BufferedReader以关闭套接字。

到目前为止我已尝试过的事情:

  • 从另一个Thread =>调用close()方法插座对象的NPE
  • 从另一个主题
  • running设置为false
  • 将所有方法设置为已同步
  • 称为shutdownInput的Socket =>插座对象的NPE
  • volatile个关键字添加到running
  • 打断了线程并希望它能够中断BufferedReader
  • 扩展Thread而不是实现Runnable

    public class IRCConnection implements Runnable {
    private BufferedReader br;
    private BufferedWriter bw;
    private Socket ircSocket;
    
    // constructor and other irrelevant methods
    .... 
    
    // relevant methods
    public void run() {
        // creating socket
        ircSocket = new Socket();
        try {
            ircSocket.setSoTimeout(100);
            // opening connection
            ircSocket.connect(new InetSocketAddress(getServer(), getPort()));
    
    
            br = new BufferedReader(new InputStreamReader(ircSocket.getInputStream()));
            bw = new BufferedWriter(new OutputStreamWriter(ircSocket.getOutputStream()));
    
        String inputLine;
        while (isRunning()) {
            inputLine = br.readLine();
                if (inputLine != null) {
                    doSomething();
                    }
                }
            }
        close();
        } catch (IOException ie) {
            log(ie);
        }
    }
    
    public void close() {
        if (ircSocket != null) {
                if (ircSocket.isConnected()) {
                    setRunning(false);
                    try {
                    ircSocket.close();
                    } catch (IOException e) {
                    log(e);
                }
            }
        }
    }
    

    }

我在另一个对象中创建了runnable,并使用Thread(irc).start()启动Runnable来启动它。

我真的不明白我如何在两个线程中都有一个初始化和连接的Socket,或者至少能够在一个线程中停止它。

1 个答案:

答案 0 :(得分:1)

  

调用Socket的shutdownInput

这是正确答案。

  

=>插座对象的NPE

所以解决这个问题。当然你可以解决一个NPE?