如何为CompletableFutures提供ThreadLocal?

jac*_*ack 5 java java.util.concurrent java-8

我需要为ThreadLocal最终运行特定CompletableFuture.supplyAsync供应商的所有线程提供一个。

从javadoc中,我看到CompletableFuture使用“ ForkJoinPool commonPool()”非常适合我的性能用例。

如何将ThreadLocal(然后删除)转移到运行特定CompletableFuture供应商的所有池线程?

备注:

我看到所有CompletableFuture async完成方法都接受执行程序。我想使用默认值,ForkJoinPool commonPool()但是如果无法实现,我想我必须重写ThreadPoolExecutor并实现beforeExecute吗?

The*_*tor 3

我想你必须找到自己的方法来解决它,因为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/感兴趣