So far, we focused on concurrency within a Scala program running in a single JVM process. Whenever we wanted to allow multiple computations to proceed concurrently, we created new threads or sent
Runnable objects to
Executor threads. Another venue to concurrency is to create separate processes. As explained in Chapter 2, Concurrency on the JVM and the Java Memory Model, separate processes have separate memory spaces and cannot share the memory directly.
There are several reasons why we occasionally want to do this. First, while JVM has a very rich ecosystem with thousands of software libraries for all kinds of tasks, sometimes, the only available implementation of a certain software component is a command-line utility or prepackaged program. Running it in a new process could be the only way to harvest its functionality. Second, sometimes we want to put Scala or Java code that we do not trust in a sandbox. A third-party plugin might have to run with a reduced...