java - 如何为 CompletableFutures 提供 ThreadLocal?

标签 java java-8 java.util.concurrent

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

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

如何将 ThreadLocal(然后删除)传输到运行特定 CompletableFuture Supplier 的所有池线程?

备注:

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

最佳答案

我猜你必须找到自己的方法来解决它,因为 ForkJoinTask 上的 exec() 是 protected 。对于具体的实现,您当然可以编写自己的包装器。

这是我对单个 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 感兴趣

关于java - 如何为 CompletableFutures 提供 ThreadLocal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24981750/

相关文章:

java-8 - Java 8 - 通用供应商

java - Java 中的可选 orElse 可选

java - ReentrantLock 未显示预期结果

java - 在java中的某些条件下阻塞线程

java - 监控 Java 8 ForkJoinPool

Android Java.Lang Locale Number Format I/O 不对称问题

java - 使用滑动窗口时事实无法自动删除

Java 8不等待ffmpeg进程输出缓冲区读取完成

java - Google Cloud Datastore 删除给定键的命名空间内的所有实体

java - 使用c、c++或java实现扫描光盘调度