I need to provide a ThreadLocal to all the threads which end up running specific CompletableFuture.supplyAsync Suppliers.
From the javadoc I see that CompletableFuture uses "ForkJoinPool commonPool()" which very much fits my performance use case.
How do I transfer a ThreadLocal (and afterwards delete) to all pool threads running a specific CompletableFuture Supplier?
Remark:
I see that all CompletableFuture async completion methods accept an Executor. I would love to use the
default ForkJoinPool commonPool() but if this is not possible I guess I have to override ThreadPoolExecutor and implement beforeExecute?
I guess you'll have to find your own way arround it as exec() on ForkJoinTask is protected. For concrete implementations you can of course write your own wrapper.
This is what I would do for a single ThreadLocal and 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);
}
}
}
From there you can use ForkJoinTask.adapt(). Otherwise you might be interrested in https://stackoverflow.com/a/7260332/1266906
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With