jac*_*ack 5 java java.util.concurrent java-8
我需要为ThreadLocal最终运行特定CompletableFuture.supplyAsync供应商的所有线程提供一个。
从javadoc中,我看到CompletableFuture使用“ ForkJoinPool commonPool()”非常适合我的性能用例。
如何将ThreadLocal(然后删除)转移到运行特定CompletableFuture供应商的所有池线程?
备注:
我看到所有CompletableFuture async完成方法都接受执行程序。我想使用默认值,ForkJoinPool commonPool()但是如果无法实现,我想我必须重写ThreadPoolExecutor并实现beforeExecute吗?
我想你必须找到自己的方法来解决它,因为exec()它ForkJoinTask受到保护。对于具体的实现,您当然可以编写自己的包装器。
这就是我对 singleThreadLocal和 a所做的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
从那里您可以使用ForkJoinTask.adapt(). 否则您可能会对/sf/answers/508223271/感兴趣