我有一个提供资源的第三方Java库。
TheResource resource = TheResource.create()
稍后,当我完成资源时,我应该关闭资源
resource.close()
根据库文档,我创建的资源是ThreadLocal变量。这意味着每个线程都会创建资源,并且它会粘在线程上。我的问题是,当关联的线程完成时,是否可以自动调用close()
方法?如果线程是我自己的自定义线程,我想我可以做到,因为我可以参与线程的生命周期。但我的问题是关于系统提供的那些线程。
例如,在Android中,SyncAdapter为您提供了一个主题。我不知道线程是如何完成的。我想知道在线程的生命周期方面是否存在某种“钩子”机制,以便我可以关闭线程的ThreadLocal资源。
答案 0 :(得分:0)
资源可能不是静态创建的,而是ThreadLocal,因此多个线程可以独立使用自己的资源。
因此调用TheResource.create()
的线程就是那个线程。您有责任第二次和第三次致电create
在同一个线程上执行此操作。然后close
在该线程结束时 - 在同一个线程上。
(可能不需要在同一个线程上完成关闭。)
你可以在课堂上打包。
Fpr实例:
public class ResourceManager {
private static final Set<TheResource> resources = new HashSet<>();
public static TheResource create() {
TheResource res = TheResource.create();
// Not needced: Thread thread = Tread.currentThread();
resources.add(res);
return res;
}
public static void shutdown() {
resources.forEach(TheResource::close);
}
}
在关闭的应用程序中:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { ResourceManager.shutDown(); }
});
答案 1 :(得分:0)
在ThreadLocal机制中似乎没有任何可用的回调。这将留下垃圾回收,因为死线程的ThreadLocalMap中的所有对象最终都将被垃圾回收。因此,您可以重写Object.finalize()进行清理。不理想,但是...