Concurrency and Source Panels
Thread Local Context
Give each thread its own local label while the main thread combines stable results.
Thread Local Context
ThreadLocalContext.kt
val currentLabel = ThreadLocal.withInitial { "unset" }
fun collectLabel(label: String, slot: Int, output: Array<String>) {
currentLabel.set(label)
val local = currentLabel.get()
output[slot] = "$local:${label.length}"
currentLabel.remove()
}
fun main() {
val suffix =
val output = Array(2) { "" }
val first = Thread { collectLabel("read-$suffix", 0, output) }
val second = Thread { collectLabel("write-$suffix", 1, output) }
first.start()
second.start()
first.join()
second.join()
println("suffix=$suffix")
println(output.joinToString("|"))
}
val currentLabel = ThreadLocal.withInitial { "unset" }
fun collectLabel(label: String, slot: Int, output: Array<String>) {
currentLabel.set(label)
val local = currentLabel.get()
output[slot] = "$local:${label.length}"
currentLabel.remove()
}
fun main() {
val suffix =
val output = Array(2) { "" }
val first = Thread { collectLabel("read-$suffix", 0, output) }
val second = Thread { collectLabel("write-$suffix", 1, output) }
first.start()
second.start()
first.join()
second.join()
println("suffix=$suffix")
println(output.joinToString("|"))
}
val currentLabel = ThreadLocal.withInitial { "unset" }
fun collectLabel(label: String, slot: Int, output: Array<String>) {
currentLabel.set(label)
val local = currentLabel.get()
output[slot] = "$local:${label.length}"
currentLabel.remove()
}
fun main() {
val suffix =
val output = Array(2) { "" }
val first = Thread { collectLabel("read-$suffix", 0, output) }
val second = Thread { collectLabel("write-$suffix", 1, output) }
first.start()
second.start()
first.join()
second.join()
println("suffix=$suffix")
println(output.joinToString("|"))
}
thread local
`ThreadLocal` stores one value per thread, which keeps per-thread context separate even when the same function runs twice.