Concurrency and Source Panels
Thread Result Slots
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
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)
}
}
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()def leftWork(seed: Int): Unit =
5def leftWork(seed6: Int): Unit = {6 left = seed + 4first.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()def rightWork(seed: Int): Unit =
9def rightWork(seed6: Int): Unit = {10 right = seed * 3total ← 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
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()def leftWork(seed: Int): Unit =
5def leftWork(seed3: Int): Unit = {6 left = seed + 4second.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()def rightWork(seed: Int): Unit =
9def rightWork(seed3: Int): Unit = {10 right = seed3 * 311}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
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()def leftWork(seed: Int): Unit =
5def leftWork(seed9: Int): Unit = {6 left = seed + 4second.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()def rightWork(seed: Int): Unit =
9def rightWork(seed9: Int): Unit = {10 right = seed * 3total ← 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