我需要为所有最终运行特定 CompletableFuture.supplyAsync
供应商的线程提供一个 ThreadLocal
。
从 javadoc 中我看到 CompletableFuture
使用“ForkJoinPool commonPool()
”,这非常适合我的性能用例。
如何将 ThreadLocal
(然后删除)传输到运行特定 CompletableFuture Supplier 的所有池线程?
备注:
我看到所有 CompletableFuture async
完成方法都接受一个 Executor。我很乐意使用
默认 ForkJoinPool commonPool()
但如果这不可能,我想我必须覆盖 ThreadPoolExecutor
并实现 beforeExecute
?
最佳答案
我猜你必须找到自己的方法来解决它,因为 ForkJoinTask
上的 exec()
是 protected 。对于具体的实现,您当然可以编写自己的包装器。
这是我对单个 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 感兴趣
关于java - 如何为 CompletableFutures 提供 ThreadLocal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24981750/