我需要为最终运行特定ThreadLocal
供应商的所有线程提供CompletableFuture.supplyAsync
。
从javadoc我看到CompletableFuture
使用" ForkJoinPool commonPool()
"这非常适合我的性能用例。
如何将ThreadLocal
(以及之后删除)传输到运行特定CompletableFuture供应商的所有池线程?
备注:
我看到所有CompletableFuture async
完成方法都接受Executor。我很乐意使用
默认ForkJoinPool commonPool()
但如果无法做到这一点,我想我必须覆盖ThreadPoolExecutor
并实施beforeExecute
?
答案 0 :(得分:2)
我猜您必须找到自己的方式,因为exec()
上ForkJoinTask
受到保护。对于具体实现,您当然可以编写自己的包装器。
这就是我对单个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