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

时间:2016-02-04 19:43:35

标签: java android multithreading thread-local

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

TheResource resource = TheResource.create()

稍后,当我完成资源时,我应该关闭资源

resource.close()

根据库文档,我创建的资源是ThreadLocal变量。这意味着每个线程都会创建资源,并且它会粘在线程上。我的问题是,当关联的线程完成时,是否可以自动调用close()方法?如果线程是我自己的自定义线程,我想我可以做到,因为我可以参与线程的生命周期。但我的问题是关于系统提供的那些线程。

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

2 个答案:

答案 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()进行清理。不理想,但是...