在Java中,如何在线程完成时关闭ThreadLocal资源
问题描述:
我有第三方Java库提供资源。在Java中,如何在线程完成时关闭ThreadLocal资源
TheResource resource = TheResource.create()
一段时间后,当我与资源完成的,我应该关闭资源
resource.close()
据库文件,我创建资源是一个ThreadLocal变量。这意味着资源是为每个线程创建的,并且它坚持线程。我的问题是,关联线程完成后是否可以自动调用close()
方法?我想我可以做到这一点,如果线程是我自己的自定义线程,因为我可以参与线程的生命周期。但我的问题是关于系统提供的线程。
例如,在Android的SyncAdapter中为您提供了一个线程。我不知道线程是如何完成的。我想知道在线程生命周期中是否存在某种“钩子”机制,以便我可以关闭线程的ThreadLocal资源。
答
该资源可能不是静态创建的,而是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(); }
});
我不跟着你。你说图书馆创建了一个资源,但是图书馆的文档说_you_必须提供一个'ThreadLocal'?也许如果你提供了一些代码示例或文档中的一些直接引用... –
我想明白你正在做什么,但也是一个非常困难,如果不是不可能没有一些奇怪的Java黑魔法。即使你能够监听线程来完成,你也必须在死的线程上下文中调用ThreadLocal.remove()。也许'Object.finalize()'是最接近你可以得到的,但它需要子类化该上下文线程。 – Whome