Running Concurrent Tasks with Scala Futures

Goal

Execute multiple tasks concurrently using Scala Futures and wait for their completion.

Setup

scalaVersion := "2.13.6" // Also supports 2.12.x

Implementation

import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
    
object Application extends App {

    def writeStuff(step: Int, max: Int, name: String) = {
        for(i <- 1 to max){
            Thread.sleep(step*1000)
            println(s"task $name => $i s")
        }
    }

    val futureTask1 = Future { writeStuff(1, 10, "la primera") }
    val futureTask2 = Future { writeStuff(2, 8, "la segunda") }

    val futures: List[Future[Unit]] = List(futureTask1, futureTask2)

    futures.map(f => {
        println("===== Sending await for task")
        Await.result(f, Duration(100, "seconds"))
    })
}

Both tasks start immediately when wrapped in Future. The Await.result blocks until each future completes, with a 100-second timeout per task.