Store values produced by two threads in separate result slots.

thread-result Two threads can update independent fields, then the main thread joins them and reads the final scalar results.

Thread Result Slots

seed
ThreadResultSlots.scala
Replay: real traced execution (multi-file project)
object Main {
  var left = 0
  var right = 0

  def leftWork(seed: Int): Unit = {
    left = seed + 4
  }

  def rightWork(seed: Int): Unit = {
    right = seed * 3
  }

  def main(args: Array[String]): Unit = {
    val seed = 6

    val first = Thread(() => leftWork(seed))
    val second = Thread(() => rightWork(seed))

    first.start()
    second.start()
    first.join()
    second.join()

    val total = left + right
    println("left=" + left)
    println("right=" + right)
    println("total=" + total)
  }
}
object Main {
  var left = 0
  var right = 0

  def leftWork(seed: Int): Unit = {
    left = seed + 4
  }

  def rightWork(seed: Int): Unit = {
    right = seed * 3
  }

  def main(args: Array[String]): Unit = {
    val seed = 3

    val first = Thread(() => leftWork(seed))
    val second = Thread(() => rightWork(seed))

    first.start()
    second.start()
    first.join()
    second.join()

    val total = left + right
    println("left=" + left)
    println("right=" + right)
    println("total=" + total)
  }
}
object Main {
  var left = 0
  var right = 0

  def leftWork(seed: Int): Unit = {
    left = seed + 4
  }

  def rightWork(seed: Int): Unit = {
    right = seed * 3
  }

  def main(args: Array[String]): Unit = {
    val seed = 9

    val first = Thread(() => leftWork(seed))
    val second = Thread(() => rightWork(seed))

    first.start()
    second.start()
    first.join()
    second.join()

    val total = left + right
    println("left=" + left)
    println("right=" + right)
    println("total=" + total)
  }
}
  1. seed ← 6, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]

    13def main(args: Array[String]): Unit = {14  val seed→ 6 = 6 //@seed=3, 91516  val first→ Thread[#19,Thread-0,5,main] = Thread(() => leftWork(seed))17  val second→ Thread[#20,Thread-1,5,main] = Thread(() => rightWork(seed))1819  firstThread[#19,Thread-0,5,main].start()20  second.start()21  first.join()
  2. def leftWork(seed: Int): Unit =

    5def leftWork(seed6: Int): Unit = {6  left = seed + 4
  3. first.start()

    5def leftWork(seed: Int): Unit = {6  left = seed6 + 47}89def rightWork(seed: Int): Unit = {10  right = seed * 311}1213def main(args: Array[String]): Unit = {14  val seed = 6 //@seed=3, 91516  val first = Thread(() => leftWork(seed))17  val second = Thread(() => rightWork(seed))1819  firstThread[#19,Thread-0,5,main].start()20  secondThread[#20,Thread-1,5,main].start()21  first.join()22  second.join()
  4. def rightWork(seed: Int): Unit =

    9def rightWork(seed6: Int): Unit = {10  right = seed * 3
  5. total ← 28

    9  def rightWork(seed: Int): Unit = {10    right = seed6 * 311  }1213  def main(args: Array[String]): Unit = {14    val seed = 6 //@seed=3, 91516    val first = Thread(() => leftWork(seed))17    val second = Thread(() => rightWork(seed))1819    first.start()20    secondThread[#20,Thread-1,5,main].start()21    firstThread[#19,Thread-0,5,].join()22    secondThread[#20,Thread-1,5,].join()2324    val total→ 28 = left10 + right1825    println("left=" + left10)26    println("right=" + right18)27    println("total=" + total28)28  }29}
    outputleft=10
    right=18
    total=28
  1. seed ← 3, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]

    13def main(args: Array[String]): Unit = {14  val seed→ 3 = 31516  val first→ Thread[#19,Thread-0,5,main] = Thread(() => leftWork(seed))17  val second→ Thread[#20,Thread-1,5,main] = Thread(() => rightWork(seed))1819  firstThread[#19,Thread-0,5,main].start()20  second.start()21  first.join()
  2. def leftWork(seed: Int): Unit =

    5def leftWork(seed3: Int): Unit = {6  left = seed + 4
  3. second.start()

    5def leftWork(seed: Int): Unit = {6  left = seed3 + 47}89def rightWork(seed: Int): Unit = {10  right = seed * 311}1213def main(args: Array[String]): Unit = {14  val seed = 31516  val first = Thread(() => leftWork(seed))17  val second = Thread(() => rightWork(seed))1819  first.start()20  secondThread[#20,Thread-1,5,main].start()21  first.join()22  second.join()
  4. def rightWork(seed: Int): Unit =

    9def rightWork(seed3: Int): Unit = {10  right = seed3 * 311}
  5. total ← 16

    20    second.start()21    firstThread[#19,Thread-0,5,].join()22    secondThread[#20,Thread-1,5,].join()2324    val total→ 16 = left7 + right925    println("left=" + left7)26    println("right=" + right9)27    println("total=" + total16)28  }29}
    outputleft=7
    right=9
    total=16
  1. seed ← 9, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]

    13def main(args: Array[String]): Unit = {14  val seed→ 9 = 91516  val first→ Thread[#19,Thread-0,5,main] = Thread(() => leftWork(seed))17  val second→ Thread[#20,Thread-1,5,main] = Thread(() => rightWork(seed))1819  firstThread[#19,Thread-0,5,main].start()20  second.start()21  first.join()
  2. def leftWork(seed: Int): Unit =

    5def leftWork(seed9: Int): Unit = {6  left = seed + 4
  3. second.start()

    5def leftWork(seed: Int): Unit = {6  left = seed9 + 47}89def rightWork(seed: Int): Unit = {10  right = seed * 311}1213def main(args: Array[String]): Unit = {14  val seed = 91516  val first = Thread(() => leftWork(seed))17  val second = Thread(() => rightWork(seed))1819  first.start()20  secondThread[#20,Thread-1,5,main].start()21  first.join()22  second.join()
  4. def rightWork(seed: Int): Unit =

    9def rightWork(seed9: Int): Unit = {10  right = seed * 3
  5. total ← 40

    9  def rightWork(seed: Int): Unit = {10    right = seed9 * 311  }1213  def main(args: Array[String]): Unit = {14    val seed = 91516    val first = Thread(() => leftWork(seed))17    val second = Thread(() => rightWork(seed))1819    first.start()20    second.start()21    firstThread[#19,Thread-0,5,].join()22    secondThread[#20,Thread-1,5,].join()2324    val total→ 40 = left13 + right2725    println("left=" + left13)26    println("right=" + right27)27    println("total=" + total40)28  }29}
    outputleft=13
    right=27
    total=40