如何从主线程终止子线程[重复]

Posted

技术标签:

【中文标题】如何从主线程终止子线程[重复]【英文标题】:How to terminate child thread from main [duplicate] 【发布时间】:2019-01-27 19:23:37 【问题描述】:

我正在尝试终止子线程,它正在等待来自服务器的输入。我试过用国旗做,但它停在 message = serverReader.readLine() && !isClosed(), 因为它等待来自服务器的输入,并且只有在此输入之后它才检查标​​志并中断。但这不是一个好的解决方案,因为没有服务器消息我无法停止它。 我还尝试先检查标志,然后检查 readline(),但它也不起作用。 有什么好的解决办法吗?

@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();
    

【问题讨论】:

不,我已经读过了。他们使用标志的问题,我也有来自服务器的 readline(),这会停止处理和标志检查 什么是 serverReader? 我用 serverReader 更新了问题 @AndrewTobilko 是否有可能直接中断线程而不是关闭套接字会造成泄漏? @BheshGurung hhm,这很有趣...我不确定,但我认为某些资源可能被错误地释放/或根本没有释放,因此可能存在泄漏。跨度> 【参考方案1】:

交换&& 订单。 && 运算符是短路的,所以如果左侧失败,右侧将不会执行。 || 则相反。

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

【讨论】:

正如我上面写的,我试过了。它没有帮助。我认为它检查了标志,它是假的,它去等待排队。有可能根本收不到任何其他消息,但我仍然需要在需要时停止它。 isClosed() 可能会在条件 !isClosed() 验证后立即转换为 true

以上是关于如何从主线程终止子线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

GMSThreadException' 原因:'API 方法必须从主线程调用'

如何从主线程超时java线程?

MFC:如何从主线程使用 MsgWaitForMultipleObjects() 来等待多个线程完成使用 SendMessage()?

android 主线程和子线程之间的消息传递

从主函数向线程发送信号?

从主线程中删除 AlamofireImage responseImage