【问题标题】:Stop Thread that is blocked reading from a readLine() method停止从 readLine() 方法读取被阻塞的线程
【发布时间】:2012-11-13 16:12:47
【问题描述】:
while (active) {
   String message = reader.readLine();
}


public void stop(){
   active = false;
}

如何在readLine() 返回String 之前停止这个Thread

【问题讨论】:

  • 什么?你的意思是How 而不是Why
  • 我不明白。你的线程在读到一行之前就停止了吗?如果您没有调用 stop 方法,有几个选项可以停止该线程......但我不确定这是否是您的意思。

标签: java multithreading http sockets buffer


【解决方案1】:

正如您可能已经确定的那样,您的布尔检查一切正常,但如果您的线程在网络 I/O 上阻塞或处于休眠状态,则无法正常工作。相反,您需要interrupt 这个线程。详情请见here

【讨论】:

    【解决方案2】:

    在这种情况下,您的 BufferedReader 必须关闭才能解除对读取线程的阻塞。

    public void stop() {
        closeQuietly(reader); // unblock
        active = false;
    }
    
    public static void closeQuietly(Closable c) {
        if(c != null)
            try {
                c.close();
            } catch(IOException ignored) { }
    }
    

    【讨论】:

    • 我没有找到这个 Classe IOUtils
    • 它是apache common IO的一部分。它的简单代码你可以自己添加。
    • 此方法从 BufferReader 执行 .close。当我尝试这个时,我的应用程序崩溃了
    • @turim 不,它不会,它会抛出一个异常,你会捕获它。
    • @turim Java 应用程序不只是崩溃(除了非常罕见的错误)通常它们会触发您可能无法正确处理的异常,但这不是崩溃。
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多