https://github.com/scala/scala-java8-compat/blob/05be2b2c0e56bdda0ca0519ff5ff7e7d0f2a17be/src/main/scala/scala/concurrent/java8/FutureConvertersImpl.scala#L35 After converting a scala future to a java future, the synchronous functions are implemented by calling async ones. And it's not using the ones that are taking the extra executor parameter. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#thenApplyAsync-java.util.function.Function- In this case, thread local values will be lost including the execution context