繁体   English   中英

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

[英]In Java, how to close ThreadLocal resource when thread is finished

我有一个提供资源的第三方Java库。

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(); }
});

ThreadLocal机制中似乎没有任何可用的回调。 这将留下垃圾回收,因为死线程的ThreadLocalMap中的所有对象最终都将被垃圾回收。 因此,您可以重写Object.finalize()进行清理。 不理想,但是...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM