java – 如何为CompletableFutures提供ThreadLocal?

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

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

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

备注:

我看到所有CompletableFuture异步完成方法都接受Executor.我很乐意使用
默认的ForkJoinPool commonPool()但如果这是不可能的,我想我必须重写ThreadPoolExecutor并实现beforeExecute?

最佳答案 我想你必须找到自己的方式,因为ForkJoinTask上的exec()受到保护.对于具体实现,您当然可以编写自己的包装器.

这就是我要为单个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被捕

点赞