如何为CompletableFutures提供ThreadLocal?

时间:2014-07-27 14:03:52

标签: java java-8 java.util.concurrent

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

从javadoc我看到CompletableFuture使用" ForkJoinPool commonPool()"这非常适合我的性能用例。

如何将ThreadLocal(以及之后删除)传输到运行特定CompletableFuture供应商的所有池线程?

备注:

我看到所有CompletableFuture async完成方法都接受Executor。我很乐意使用 默认ForkJoinPool commonPool()但如果无法做到这一点,我想我必须覆盖ThreadPoolExecutor并实施beforeExecute

1 个答案:

答案 0 :(得分:2)

我猜您必须找到自己的方式,因为exec()ForkJoinTask受到保护。对于具体实现,您当然可以编写自己的包装器。

这就是我对单个ThreadLocalCallable

所做的事情
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

感兴趣