【发布时间】:2023-03-15 15:45:01
【问题描述】:
所以,我正在尝试编写一个一直运行直到你告诉它停止的任务:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext
import java.util.concurrent.RejectedExecutionException
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
}
val ctx = runUntilShutdown(Thread.sleep(1000))
ctx.shutdown
我希望这只是在最后打印“完成”,但这永远不会发生。
相反,RejectedExecutionException 的堆栈跟踪被转储到 stderr:
java.util.concurrent.RejectedExecutionException
at scala.concurrent.forkjoin.ForkJoinPool.fullExternalPush(ForkJoinPool.java:1870)
at scala.concurrent.forkjoin.ForkJoinPool.externalPush(ForkJoinPool.java:1834)
at scala.concurrent.forkjoin.ForkJoinPool.execute(ForkJoinPool.java:2973)
at scala.concurrent.impl.ExecutionContextImpl$$anon$1.execute(ExecutionContextImpl.scala:136)
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:44)
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:252)
at scala.concurrent.Promise$class.complete(Promise.scala:55)
at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:157)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
at scala.concurrent.forkjoin.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1361)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
想法?
【问题讨论】:
标签: scala concurrency future