import com.twitter.util.{Duration, Future, FuturePool, Try} import java.util.concurrent.{LinkedBlockingQueue, ThreadPoolExecutor, TimeUnit} val poolSize = 4 val queue = new LinkedBlockingQueue[Runnable]() val executor = new ThreadPoolExecutor(poolSize, poolSize, 0L, TimeUnit.MILLISECONDS, queue) val futurePool = FuturePool(executor) def doWork(n: Int): Int = { Thread.sleep(1000) n } def niceThread(n: Int): Future[Int] = (futurePool { doWork(n) futurePool { doWork(n) } }).flatten val data1F = niceThread(1) val data2F = niceThread(2) val data3F = niceThread(3) val data4F = niceThread(4) val resultF = for { data1 <- data1F data2 <- data2F data3 <- data3F data4 <- data4F } yield { data1 + data2 + data3 + data4 } resultF.get(Duration.fromSeconds(3))