hey*_*you 3 java java-8 java-stream
我有一个ThreadLocal变量.我想像这样使用它:
ThreadLocal<AutoCloseable> threadLocal = new ThreadLocal<AutoCloseable>(); // pseudocode
ForkJoinPool fj = new ForkJoinPool(nThreads);
fj.submit(
() -> myStream.parallel().forEach(e -> {
/*I want to use the thread local autocloseable here,
but how do I close it when this parallel processing is done?*/
})
);
Run Code Online (Sandbox Code Playgroud)
ThreadLocal在使用它们的线程死后关闭.如果你想控制它,你需要使用地图.
// do our own thread local resources which close when we want.
Map<Thread, Resource> threadLocalMap = new ConcurrentHashMap<>();
fj.submit(
() -> myStream.parallel().forEach(e -> {
Resource r = threadLocalMap.computeIfAbsent(Thread.currentThread(), t -> new Resource();
// use the thread local autocloseable here,
})
// later once all the tasks have finished.
// close all the thread local resources when the parallel processing is done
threadLocalMap.values().forEach(Utils::closeQuietly);
Run Code Online (Sandbox Code Playgroud)
有一种方法可以在不抛出异常的情况下关闭资源.Chronicle有一个,但许多其他库也是如此.
public static void closeQuietly(Closeable c) {
if (c != null) {
try {
c.close();
} catch (IOException ioe) {
// ignore or trace log it
}
}
}
Run Code Online (Sandbox Code Playgroud)
很可能你有一个方法在你的项目中做到这一点 https://www.google.co.uk/search?q=public+static+void+closequietly+Closeable