gpt4 book ai didi

java - 如何查明客户端/服务器套接字连接的所有资源(线程、PrintWriter 等)是否正确关闭?

转载 作者:行者123 更新时间:2023-12-02 00:10:24 25 4
gpt4 key购买 nike

我正在编写客户端/套接字连接代码,并使用线程池来处理多个客户端。

我的服务器启动后,我使用了多个资源。我想关闭所有这些,如果例如:服务器告诉客户端它应该关闭,我想关闭所有内容。

我仍然编写了基本的关闭功能:

public static void killClient() {
try {
threadpool.shutdown();
in.close();//client input
out.close();//client output
socket.close();
} catch(Exception e) {
System.out.println("Client has been shutdown! " + e);
e.printStackTrace();
}
}

我的问题是:

如何确保所有内容都已正确关闭并且没有任何内容仍在运行?

最佳答案

How to be sure that everything has closed propely and nothing still runs anymore?

我已经回答了下面的具体问题。

我认为“关闭”你的类比集中精力关闭资源更重要。如果一个类(例如上面的 Client 类)包装了线程池和套接字等资源,那么它应该有一个 close() 方法(例如上面的 killClient())。如果服务器 fork 客户端,那么它应该管理它们,以便 server.close() 调用各种 client.killClient() 方法。

如果您热衷于正确关闭各种类,并在各处使用 try {} finally {} block ,则不必担心未关闭的资源和挂起的线程。

<小时/>

这很难做到,并且没有针对所有资源类型的一揽子答案。以下是一些可能有帮助的想法。

  • 对于线程,您可以使用诸如 Threads.getAllStackTraces() 之类的东西来显示剩余的线程。如果您在程序启动时和完成时比较此列表,您应该能够看到剩下的内容。

  • 文件描述符要困难得多。如果您在 Linux 上运行,那么您可以查看/proc/self/fd 目录以查看哪些描述符仍然打开。再次比较开始和结束。您还可以查看OpenFileDescriptorCount JMX variable (java.lang:type=OperatingSystem) 在您的应用程序中,但这只是给出了没有上下文的描述符数量。

  • 没有简单的方法可以检测其他资源中的泄漏。您可以在它们周围包装一个 ResourceManager 类型类,从中“生成”和“释放”资源,但这需要编程支持。如果您在管理器外部创建资源,则没有简单的方法来检测泄漏。

  • 这种机制的一个例子是我为 ORMLite 所做的事情。测试。 ORMLite 打开和关闭大量数据库连接,我想确保我的代码中没有流失它们。我创建了一个围绕数据库连接的包装器,该包装器在创建数据库连接时向管理器注册自己,并在关闭数据库连接时取消注册。然后我可以确保 assertTrue(connectionManager.isAllConnectionsClo​​sed());。不确定这是否有帮助。

关于java - 如何查明客户端/服务器套接字连接的所有资源(线程、PrintWriter 等)是否正确关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12938668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com