Scala bounded worker pool collecting failures
Scala
import java.util.concurrent.{Callable, Executors, TimeUnit}
import scala.util.{Failure, Success, Try}
def runPool[A, B](tasks: Seq[() => A], workers: Int)(f: A => B): (Seq[B], Seq[Throwable]) =
val pool = Executors.newFixedThreadPool(workers)
try
val futures = tasks.map(task => pool.submit(new Callable[B] { def call(): B = f(task()) }))
val outcomes = futures.map(future => Try(future.get()))
(outcomes.collect { case Success(value) => value },
outcomes.collect { case Failure(error) => error })
finally
pool.shutdown()
pool.awaitTermination(30, TimeUnit.SECONDS)