在Java中,如何在线程完成时关闭ThreadLocal资源

问题描述:

我有第三方Java库提供资源。在Java中,如何在线程完成时关闭ThreadLocal资源

TheResource resource = TheResource.create() 

一段时间后,当我与资源完成的,我应该关闭资源

resource.close() 

据库文件,我创建资源是一个ThreadLocal变量。这意味着资源是为每个线程创建的,并且它坚持线程。我的问题是,关联线程完成后是否可以自动调用close()方法?我想我可以做到这一点,如果线程是我自己的自定义线程,因为我可以参与线程的生命周期。但我的问题是关于系统提供的线程。

例如,在Android的SyncAdapter中为您提供了一个线程。我不知道线程是如何完成的。我想知道在线程生命周期中是否存在某种“钩子”机制,以便我可以关闭线程的ThreadLocal资源。

+1

我不跟着你。你说图书馆创建了一个资源,但是图书馆的文档说_you_必须提供一个'ThreadLocal'?也许如果你提供了一些代码示例或文档中的一些直接引用... –

+0

我想明白你正在做什么,但也是一个非常困难,如果不是不可能没有一些奇怪的Java黑魔法。即使你能够监听线程来完成,你也必须在死的线程上下文中调用ThreadLocal.remove()。也许'Object.finalize()'是最接近你可以得到的,但它需要子类化该上下文线程。 – Whome

该资源可能不是静态创建的,而是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(); } 
}); 
+0

我不确定我是否正确理解您的答案。让我以这种方式提出我的问题:有一种方法可以在线程完成时以自定义方式清理ThreadLocal变量,前提是线程由系统为您提供。 – Jake

+0

添加了一个示例。 –

+0

这是“如何通过三个简单步骤创建内存泄漏”的示例代码。只在最后独立于实际生命周期清理资源通常是不好的行为。 – Voo