Concurrency and Source Panels
Thread Result Slots
Run named thread functions and store their results in stable slots before joining.
thread result
Threads may finish in either order, so shared examples should put results in predictable positions before the main thread reads them.
Thread Result Slots
ThreadResultSlots.kt
Replay: real traced execution (multi-file project)
fun fillDouble(seed: Int, results: IntArray) {
val doubled = seed * 2
results[0] = doubled
}
fun fillTriple(seed: Int, results: IntArray) {
val tripled = seed * 3
results[1] = tripled
}
fun main() {
val seed = 6
val results = IntArray(2)
val first = Thread { fillDouble(seed, results) }
val second = Thread { fillTriple(seed, results) }
first.start()
second.start()
first.join()
second.join()
val total = results[0] + results[1]
println("seed=$seed")
println("total=$total")
}
fun fillDouble(seed: Int, results: IntArray) {
val doubled = seed * 2
results[0] = doubled
}
fun fillTriple(seed: Int, results: IntArray) {
val tripled = seed * 3
results[1] = tripled
}
fun main() {
val seed = 3
val results = IntArray(2)
val first = Thread { fillDouble(seed, results) }
val second = Thread { fillTriple(seed, results) }
first.start()
second.start()
first.join()
second.join()
val total = results[0] + results[1]
println("seed=$seed")
println("total=$total")
}
fun fillDouble(seed: Int, results: IntArray) {
val doubled = seed * 2
results[0] = doubled
}
fun fillTriple(seed: Int, results: IntArray) {
val tripled = seed * 3
results[1] = tripled
}
fun main() {
val seed = 10
val results = IntArray(2)
val first = Thread { fillDouble(seed, results) }
val second = Thread { fillTriple(seed, results) }
first.start()
second.start()
first.join()
second.join()
val total = results[0] + results[1]
println("seed=$seed")
println("total=$total")
}
seed ← 6, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]
11fun main() {12 val seed→ 6 = 6 //@seed=3, 1013 val results = IntArray(2)1415 val first→ Thread[#19,Thread-0,5,main] = Thread { fillDouble(seed, results) }16 val second→ Thread[#20,Thread-1,5,main] = Thread { fillTriple(seed, results) }1718 firstThread[#19,Thread-0,5,main].start()19 secondThread[#20,Thread-1,5,main].start()20 first.join()fun fillDouble(seed: Int, results: IntArray)
1fun fillDouble(seed6: Int, results: IntArray) {2 val doubled = seed6 * 23 results[0] = doubleddoubled ← 12
1fun fillDouble(seed: Int, results: IntArray) {2 val doubled→ 12 = seed6 * 23 results[0] = doubled4}56fun fillTriple(seed6: Int, results: IntArray) {7 val tripled = seed6 * 38 results[1] = tripledtripled ← 18, total ← 30
2 val doubled = seed * 23 results[0]0 = doubled124}56fun fillTriple(seed: Int, results: IntArray) {7 val tripled→ 18 = seed6 * 38 results[1]0 = tripled189}1011fun main() {12 val seed = 6 //@seed=3, 1013 val results = IntArray(2)1415 val first = Thread { fillDouble(seed, results) }16 val second = Thread { fillTriple(seed, results) }1718 first.start()19 secondThread[#20,Thread-1,5,main].start()20 firstThread[#19,Thread-0,5,].join()21 secondThread[#20,Thread-1,5,].join()2223 val total→ 30 = results[0]12 + results[1]1824 println("seed=$seed6")25 println("total=$total30")26}outputseed=6 total=30
seed ← 3, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]
11fun main() {12 val seed→ 3 = 313 val results = IntArray(2)1415 val first→ Thread[#19,Thread-0,5,main] = Thread { fillDouble(seed, results) }16 val second→ Thread[#20,Thread-1,5,main] = Thread { fillTriple(seed, results) }1718 firstThread[#19,Thread-0,5,main].start()19 secondThread[#20,Thread-1,5,main].start()20 first.join()fun fillDouble(seed: Int, results: IntArray)
1fun fillDouble(seed3: Int, results: IntArray) {2 val doubled = seed3 * 23 results[0] = doubleddoubled ← 6
1fun fillDouble(seed: Int, results: IntArray) {2 val doubled→ 6 = seed3 * 23 results[0] = doubled4}56fun fillTriple(seed: Int, results: IntArray) {7 val tripled = seed * 38 results[1] = tripled9}1011fun main() {12 val seed = 313 val results = IntArray(2)1415 val first = Thread { fillDouble(seed, results) }16 val second = Thread { fillTriple(seed, results) }1718 first.start()19 secondThread[#20,Thread-1,5,main].start()20 firstThread[#19,Thread-0,5,main].join()21 second.join()tripled ← 9
2 val doubled = seed * 23 results[0]0 = doubled64}56fun fillTriple(seed3: Int, results: IntArray) {7 val tripled→ 9 = seed3 * 38 results[1] = tripledfirst ← Thread[#19,Thread-0,5,], second ← Thread[#20,Thread-1,5,]
7 val tripled = seed * 38 results[1]0 = tripled99}1011fun main() {12 val seed = 313 val results = IntArray(2)1415 val first = Thread { fillDouble(seed, results) }16 val second = Thread { fillTriple(seed, results) }1718 first.start()19 second.start()20 first→ Thread[#19,Thread-0,5,].join()21 second→ Thread[#20,Thread-1,5,].join()2223 val total→ 15 = results[0]6 + results[1]924 println("seed=$seed3")25 println("total=$total15")26}outputseed=3 total=15
seed ← 10, first ← Thread[#19,Thread-0,5,main], second ← Thread[#20,Thread-1,5,main]
11fun main() {12 val seed→ 10 = 1013 val results = IntArray(2)1415 val first→ Thread[#19,Thread-0,5,main] = Thread { fillDouble(seed, results) }16 val second→ Thread[#20,Thread-1,5,main] = Thread { fillTriple(seed, results) }1718 firstThread[#19,Thread-0,5,main].start()19 second.start()fun fillDouble(seed: Int, results: IntArray)
1fun fillDouble(seed10: Int, results: IntArray) {2 val doubled = seed * 2doubled ← 20
1fun fillDouble(seed: Int, results: IntArray) {2 val doubled→ 20 = seed10 * 23 results[0] = doubled4}56fun fillTriple(seed: Int, results: IntArray) {7 val tripled = seed * 38 results[1] = tripled9}1011fun main() {12 val seed = 1013 val results = IntArray(2)1415 val first = Thread { fillDouble(seed, results) }16 val second = Thread { fillTriple(seed, results) }1718 first.start()19 secondThread[#20,Thread-1,5,main].start()20 firstThread[#19,Thread-0,5,main].join()21 second.join()tripled ← 30
2 val doubled = seed * 23 results[0]0 = doubled204}56fun fillTriple(seed10: Int, results: IntArray) {7 val tripled→ 30 = seed10 * 38 results[1] = tripledfirst ← Thread[#19,Thread-0,5,], total ← 50
7 val tripled = seed * 38 results[1]0 = tripled309}1011fun main() {12 val seed = 1013 val results = IntArray(2)1415 val first = Thread { fillDouble(seed, results) }16 val second = Thread { fillTriple(seed, results) }1718 first.start()19 second.start()20 first→ Thread[#19,Thread-0,5,].join()21 secondThread[#20,Thread-1,5,].join()2223 val total→ 50 = results[0]20 + results[1]3024 println("seed=$seed10")25 println("total=$total50")26}outputseed=10 total=50