如何从主线程终止子线程

4

我正在尝试终止子线程,该线程正在等待来自服务器的输入。我已经尝试使用标志来实现,但它停在了 message = serverReader.readLine() && !isClosed(), 因为它在等待来自服务器的输入,只有在此输入后才检查标志并中断。但这不是一个好的解决方案,因为我无法在没有服务器消息的情况下停止它。 我还尝试首先检查标志,然后再读取行,但也不起作用。 是否有任何好的解决方案?

@Override
public void run() {
    String message;
    try {
        while((message = serverReader.readLine()) != null && !isClosed()) {
            consoleWriter.println("Other user: " + message);
            consoleWriter.flush();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void setUpNetworking() {
    try {
        Socket socket = new Socket("127.0.0.1", 5000);
        InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
        serverWriter = new PrintWriter(socket.getOutputStream());
        serverReader = new BufferedReader(streamReader);

        //Starting listening messages from server
        incomeReader = new Thread(new IncomeMessagesReader(serverReader, consoleWriter, this));
        incomeReader.start();


        System.out.println("Networking established");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

不,我已经阅读过了。问题是他们正在使用标志(flag),而我还从服务器获得了readline(),这会停止处理和标志检查。 - Anton Barinov
1
什么是serverReader? - xingbin
我已经更新了问题并添加了serverReader。 - Anton Barinov
2
@AndrewTobilko 直接中断线程而不是关闭套接字可能会导致泄漏吗? - Bhesh Gurung
1
@BheshGurung 嗯,很有趣...我不确定,但我认为一些资源可能会被错误地释放/或根本没有被释放,因此泄漏是可能的。 - Andrew Tobilko
显示剩余5条评论
1个回答

1

交换&&的顺序。 &&运算符是短路的,所以如果左侧失败,则右侧不会执行。对于||来说情况则相反。

while (!isClosed() && readLine()) 

就像我之前写的那样,我已经尝试过了,但没有帮助。我认为它检查了标志位,如果是假的,就会进入等待行的状态。可能根本不会收到其他任何消息,但当我想要停止时,我仍然必须停止它。 - Anton Barinov
2
在验证条件!isClosed()之后,isClosed()可能会被转换为true - Andrew Tobilko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接