线程结束后再执行一次

时间:2016-03-28 12:21:29

标签: java multithreading sockets network-programming socketexception

这涉及通过套接字的服务器 - 客户端网络。客户端线程在while(boolean)循环上运行。它是从ClientBean类访问的,条件设置为false。这应该停止线程或终止它。但我看到线程尝试在设置线程的运行循环条件为false后再次读取socket的InputStream。这会抛出 SocketException

bean的代码部分: -

public void disconnect() {
        client.setSendMessage(key + "disconnect");
        thd.setRunning(false);
        client.setRunning(false);
        try {
            client.getSock().close();
            inputDisabled = sendBtnDisabled = true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

线程的run()方法: -

public void run() {
        while (running) {

            try {
                if (!sock.isClosed())
                    if ((receiveMessage = receiveRead.readLine()) != null) {
                        msg = receiveMessage;
                    }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

我在if ((receiveMessage = receiveRead.readLine()) != null)行上遇到异常。 为什么在线程停止后run()的循环再次执行?而且当我从bean关闭套接字时它如何满足条件if (!sock.isClosed())

1 个答案:

答案 0 :(得分:0)

  

为什么在线程停止后run()的循环再次执行?

您的循环状态

while (running) {

所以当你做

时它会循环到running = false
        } catch (IOException e) {
            e.printStackTrace(); // print error and pretend it didn't happen.
        }

简单的解决方案是将try / catch置于循环外部,以便在发生错误时打破循环,或者您可以关闭连接并再试一次

  

当我从bean关闭套接字时,它是如何满足条件if(!sock.isClosed())的?

一旦在套接字上调用close(),此方法将返回isClosed == true。