gpt4 book ai didi

java - 如何正确关闭异步对象中的线程和文件句柄

转载 作者:行者123 更新时间:2023-11-30 03:39:22 24 4
gpt4 key购买 nike

我正在编写一个套接字接口(interface),希望它的使用看起来像这样:

SocketServer server = SocketServer.connect("some server url");
server.on("connect", new SocketEvent() {
@Override
public void onEvent() {
"Do something when socket is connected"
}
}

现在我希望发生的是,每当变量“server”超出范围时,垃圾收集就会出现并最终清理干净。它立即被释放并不是非常重要。我试图避免类似 server.close();

我需要知道的是如何在后台管理线程和流的关闭。我读过,当垃圾收集器出现时,finalize 会被调用,但每个人都说不要使用finalize。 Finalize 是我认为应该处理此类事情的地方,但是有更好的方法吗?

最佳答案

Finalize is where I'm thinking I should handle such things

终结器由垃圾收集器调用,并且垃圾收集器在需要回收未使用的内存时运行。由于缺少文件描述符、数据库连接或任何其他资源,垃圾收集器无法运行。它无法运行,因为有一个事务悬而未决......

不要使用finalize()来关闭资源。 http://www.informit.com/articles/article.aspx?p=1216151&seqNum=7

I'm trying to avoid something like, server.close();

你无法避免它。如果库要求您 close() 连接,那么您必须关闭它。

您可以使用 try...finally... 来保证您的资源已关闭/清理/无论如何:

Server server;
try {
server = ...;
server.foo();
server.bar();
...
} finally {
if (server) {
server.close();
}
}

如果您的资源对象实现了 Closeable,那么有一种更简洁的方法可以在 Java7 或 Java8 中运行:

try(Server server= ...) {
server.foo();
server.bar();
...
}

它被称为“try-with-resources”,其含义与上面的 try...finally... 构造完全相同,但 .close() 调用是隐式的。

关于java - 如何正确关闭异步对象中的线程和文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131720/

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