NanoHttpd泄漏线程

时间:2014-02-21 13:54:50

标签: android nanohttpd

有没有人遇到NanoHttpd泄漏线程的问题?

问题是库为每个传入请求创建一个新线程,当我看到对这些请求的响应时,运行请求处理的内部线程永远不会完成。这导致它最终有数百个泄露的线程和应用程序崩溃。

我的代码非常简单明了。我只是对NanoHTTPD进行子类化并覆盖serve()方法。

我调试了lib本身,它在NanoHTTPD类中永远循环使用以下代码:

while (!finalAccept.isClosed()) {        
    session.execute();
}

有什么建议吗?

更新的 原来这是连接到客户端应用程序的边缘情况,该应用程序向启动http服务器的应用程序发出请求。当我从Chrome或curl发出请求时,它不会泄漏任何线程。

1 个答案:

答案 0 :(得分:1)

我认为此泄漏是由您的客户端未关闭套接字引起的。 NanoHttpd在读取时使用5秒的超时,并且仅在客户端关闭套接字时停止服务线程:

第190行:

} catch (Exception e) {
    // When the socket is closed by the client, we throw our own SocketException
    // to break the "keep alive" loop above.
    if (!(e instanceof SocketException && "NanoHttpd Shutdown".equals(e.getMessage()))) {
        e.printStackTrace();
    }

}

第863行:

if (read == -1) {
    // socket was been closed
    safeClose(inputStream);
    safeClose(outputStream);
    throw new SocketException("NanoHttpd Shutdown");
}

我建议检查您的客户端是否正确关闭了连接,并且可能编写自己的AsyncRunner实现,而不是NanoHttpd提供的DefaultAsyncRunner,以限制线程数。除此之外,您还可以实现一种机制来阻止线程服务超过x秒(30秒将是一个很好的开始)。