background-image: url(../img/fp-tower/website-background-white.svg) class: center, middle .title[.dark-green[Analysis of global temperature
Part 4]] --- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # foldMap in parallel
--- # fold intermediate results in parallel .center[
] --- # fold intermediate results in parallel .center[
] --- # fold intermediate results in parallel .center[
] --- # fold intermediate results in parallel .center[
] --- # fold intermediate results sequentially .center[
] --- # fold intermediate results sequentially .center[
] --- # fold intermediate results sequentially .center[
] --- # fold intermediate results sequentially .center[
] --- # fold intermediate results sequentially .center[
] --- # fold intermediate results sequentially .center[
] --- # foldMap .center[
] --- # Thread ```scala def createThread(n: Int): Thread = new Thread { override def run(): Unit = println(s"Thread ${n}") } val threads = 1.to(4).map(createThread) ``` ```scala threads.foreach(_.start()) // Thread 1 // Thread 3 // Thread 2 // Thread 4 ``` --- # Executor and Runnable .fifty-seven-left[ ```scala import java.util.concurrent.Executors val fixedPool = Executors.newFixedThreadPool(2) def createRunnable(n: Int): Runnable = new Runnable { def run(): Unit = println(s"Runnable ${n}") } val runnables = 1.to(4).map(createRunnable) ``` ```scala runnables.foreach(fixedPool.submit) // Runnable 1 // Runnable 3 // Runnable 2 // Runnable 4 ``` ] .thirty-seven-right[
] --- # Executor and Runnable .fifty-seven-left[ ```scala import java.util.concurrent.Executors val fixedPool = Executors.newFixedThreadPool(2) def createRunnable(n: Int): Runnable = new Runnable { def run(): Unit = { val thread = Thread.currentThread println(s"[${thread.getName}] Runnable ${n}") } } val runnables = 1.to(4).map(createRunnable) ``` ```scala runnables.foreach(fixedPool.submit) // [pool-19-thread-1] Runnable 1 // [pool-19-thread-2] Runnable 3 // [pool-19-thread-1] Runnable 2 // [pool-19-thread-2] Runnable 4 ``` ] .thirty-seven-right[
] --- # ExecutionContext and Future ```scala import java.util.concurrent.Executors import scala.concurrent.duration._ import scala.concurrent.{ Await, ExecutionContext, Future } val fixedPool = Executors.newFixedThreadPool(2) val executionContext = ExecutionContext.fromExecutor(fixedPool) ``` ```scala val future = Future { Thread.sleep(1000) // sleep 1 second 1 }(executionContext) // future: Future[Int] = Future(
) ``` --- # ExecutionContext and Future ```scala import java.util.concurrent.Executors import scala.concurrent.duration._ import scala.concurrent.{ Await, ExecutionContext, Future } val fixedPool = Executors.newFixedThreadPool(2) implicit val executionContext = ExecutionContext.fromExecutor(fixedPool) ``` ```scala val task = Future { Thread.sleep(1000) // sleep 1 second 3 } // task: Future[Int] = Future(
) ``` -- ```scala Await.result(task, 2.minutes) // res: Int = 3 ``` --- # ExecutionContext and Future ```scala import java.util.concurrent.Executors import scala.concurrent.duration._ import scala.concurrent.{ Await, ExecutionContext, Future } val fixedPool = Executors.newFixedThreadPool(2) implicit val executionContext = ExecutionContext.fromExecutor(fixedPool) ``` ```scala val task = Future { Thread.sleep(1000 * 60 * 5) // sleep 5 minutes 3 } // task: Future[Int] = Future(
) ``` ```scala Await.result(task, 2.minutes) // java.util.concurrent.TimeoutException: // Future timed out after [2 minutes] ``` --- # ExecutionContext and Future ```scala import java.util.concurrent.Executors import scala.concurrent.duration._ import scala.concurrent.{ Await, ExecutionContext, Future } val fixedPool = Executors.newFixedThreadPool(2) implicit val executionContext = ExecutionContext.fromExecutor(fixedPool) ``` ```scala val task = Future { Thread.sleep(1000 * 60 * 5) // sleep 5 minutes 3 } // task: Future[Int] = Future(
) ``` ```scala Await.result(task, Duration.Inf) // res: Int = 3 ``` --- # ExecutionContext and Future .fifty-seven-left[
```scala val future1 = Future { task(1) } val future2 = Future { task(2) } val response1 = Await.result(future1, Duration.Inf) val response2 = Await.result(future2, Duration.Inf) ``` ] .thirty-seven-right[.center[
]] --- # ExecutionContext and Future .fifty-seven-left[
```scala val future1 = Future { task(1) } val response1 = Await.result(future1, Duration.Inf) val future2 = Future { task(2) } val response2 = Await.result(future2, Duration.Inf) ``` ] .thirty-seven-right[.center[
]]