我需要为最终运行特定CompletableFuture.supplyAsync供应商的所有线程提供ThreadLocal.
从javadoc我看到CompletableFuture使用“ForkJoinPool commonPool()”,它非常适合我的性能用例.
如何将ThreadLocal(以及之后的删除)传输到运行特定CompletableFuture供应商的所有池线程?
备注:
我看到所有CompletableFuture异步完成方法都接受Executor.我很乐意使用
默认的ForkJoinPool commonPool()但如果这是不可能的,我想我必须重写ThreadPoolExecutor并实现beforeExecute?
最佳答案 我想你必须找到自己的方式,因为ForkJoinTask上的exec()受到保护.对于具体实现,您当然可以编写自己的包装器.
这就是我要为单个ThreadLocal和Callable做的事情:
public static class WithThreadLocal<V, T> implements Callable<V> {
private final ThreadLocal<T> threadLocal;
private final T value;
private final Callable<V> callable;
public WithThreadLocal(ThreadLocal<T> threadLocal, T value, Callable<V> callable) {
this.threadLocal = threadLocal;
this.value = value;
this.callable = callable;
}
@Override
public V call() throws Exception {
T oldValue = threadLocal.get();
try {
threadLocal.set(value);
return callable.call();
} finally {
threadLocal.set(oldValue);
}
}
}
从那里你可以使用ForkJoinTask.adapt()
.否则你可能会在https://stackoverflow.com/a/7260332/1266906被捕