Эта проблема была исправлена для Scala 2.13 * с новой реализацией Future & Promise, вы можете попробовать свой пример на Scala 2.13.0-M5, но вам придется вызвать shutdownNow
на вашем ECв противном случае он просто будет продолжать работать, поскольку он не будет принимать новые задачи, но уже запускает ваше будущее.
Пример вывода:
Welcome to Scala 2.13.0-20181205-121558-76b34c4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144).
Type in expressions for evaluation. Or try :help.
scala> import scala.concurrent.Future
import scala.concurrent.Future
scala> import scala.concurrent.ExecutionContext
import scala.concurrent.ExecutionContext
scala> import java.util.concurrent.RejectedExecutionException
import java.util.concurrent.RejectedExecutionException
scala> def runUntilShutdown(f: => Unit) = {
| val ctx = ExecutionContext.fromExecutorService(null)
| import ExecutionContext.global
| def runTask(): Future[Unit] = Future(f)(ctx)
| .flatMap(_ => runTask())(ctx)
| runTask()
| .recover { case _: RejectedExecutionException => () }(global)
| .onComplete { _ => println("Done") }(global)
| ctx
| }
runUntilShutdown: (f: => Unit)scala.concurrent.ExecutionContextExecutorService
scala> val ctx = runUntilShutdown(Thread.sleep(1000))
ctx: scala.concurrent.ExecutionContextExecutorService = scala.concurrent.impl.ExecutionContextImpl$$anon$3@23d060c2[Running, parallelism = 8, size = 1, active = 1, running = 0, steals = 0, tasks = 0, submissions = 0]
scala> ctx.shutdownNow
res2: java.util.List[Runnable] = []
scala> Done
*: https://github.com/scala/bug/issues/9071 (Этобыло невозможно реализовать правильное поведение со старой реализацией Future & Promise, поэтому в настоящее время не запланировано никакого обратного порта для версии 2.12.)