Concurrency and Source Panels
Future Task Result
Run a callable on a thread and read its result through a FutureTask.
future-task
`FutureTask` stores the result produced by a worker thread so the main thread can read it after the task finishes.
Future Task Result
FutureTaskResult.scala
Replay: real traced execution (multi-file project)
import java.util.concurrent.Callable
import java.util.concurrent.FutureTask
class ScoreJob(base: Int) extends Callable[Int] {
def call(): Int = {
base + 10
}
}
object Main {
def main(args: Array[String]): Unit = {
val base = 8
val job = new ScoreJob(base)
val task = new FutureTask[Int](job)
val worker = Thread(task)
worker.start()
val score = task.get()
println("base=" + base)
println("score=" + score)
}
}
import java.util.concurrent.Callable
import java.util.concurrent.FutureTask
class ScoreJob(base: Int) extends Callable[Int] {
def call(): Int = {
base + 10
}
}
object Main {
def main(args: Array[String]): Unit = {
val base = 4
val job = new ScoreJob(base)
val task = new FutureTask[Int](job)
val worker = Thread(task)
worker.start()
val score = task.get()
println("base=" + base)
println("score=" + score)
}
}
import java.util.concurrent.Callable
import java.util.concurrent.FutureTask
class ScoreJob(base: Int) extends Callable[Int] {
def call(): Int = {
base + 10
}
}
object Main {
def main(args: Array[String]): Unit = {
val base = 12
val job = new ScoreJob(base)
val task = new FutureTask[Int](job)
val worker = Thread(task)
worker.start()
val score = task.get()
println("base=" + base)
println("score=" + score)
}
}
base ← 8, job ← ⟨ScoreJob A⟩, task ← ⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩]
10object Main {11 def main(args: Array[String]): Unit = {12 val base→ 8 = 8 //@base=4, 121314 val job→ ⟨ScoreJob A⟩ = new ScoreJob(base8)15 val task→ ⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩] = new FutureTask[Int](job⟨ScoreJob A⟩)16 val worker→ Thread[#19,Thread-0,5,main] = Thread(task⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩])17 workerThread[#19,Thread-0,5,main].start()1819 val score = task.get()task ← ⟨FutureTask B⟩[Completed normally], score ← 18
5 def call(): Int = {6 base8 + 107 }8}910object Main {11 def main(args: Array[String]): Unit = {12 val base = 8 //@base=4, 121314 val job = new ScoreJob(base)15 val task = new FutureTask[Int](job)16 val worker = Thread(task)17 worker.start()1819 val score→ 18 = task→ ⟨FutureTask B⟩[Completed normally].get()20 println("base=" + base8)21 println("score=" + score18)22 }23}outputbase=8 score=18
base ← 4, job ← ⟨ScoreJob A⟩, task ← ⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩]
10object Main {11 def main(args: Array[String]): Unit = {12 val base→ 4 = 41314 val job→ ⟨ScoreJob A⟩ = new ScoreJob(base4)15 val task→ ⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩] = new FutureTask[Int](job⟨ScoreJob A⟩)16 val worker→ Thread[#19,Thread-0,5,main] = Thread(task⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩])17 workerThread[#19,Thread-0,5,main].start()1819 val score = task.get()task ← ⟨FutureTask B⟩[Completed normally], score ← 14
5 def call(): Int = {6 base4 + 107 }8}910object Main {11 def main(args: Array[String]): Unit = {12 val base = 41314 val job = new ScoreJob(base)15 val task = new FutureTask[Int](job)16 val worker = Thread(task)17 workerThread[#19,Thread-0,5,main].start()1819 val score→ 14 = task→ ⟨FutureTask B⟩[Completed normally].get()20 println("base=" + base4)21 println("score=" + score14)22 }23}outputbase=4 score=14
base ← 12, job ← ⟨ScoreJob A⟩, task ← ⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩]
10object Main {11 def main(args: Array[String]): Unit = {12 val base→ 12 = 121314 val job→ ⟨ScoreJob A⟩ = new ScoreJob(base12)15 val task→ ⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩] = new FutureTask[Int](job⟨ScoreJob A⟩)16 val worker→ Thread[#19,Thread-0,5,main] = Thread(task⟨FutureTask B⟩[Not completed, task = ⟨ScoreJob A⟩])17 workerThread[#19,Thread-0,5,main].start()1819 val score = task.get()task ← ⟨FutureTask B⟩[Completed normally], score ← 22
5 def call(): Int = {6 base12 + 107 }8}910object Main {11 def main(args: Array[String]): Unit = {12 val base = 121314 val job = new ScoreJob(base)15 val task = new FutureTask[Int](job)16 val worker = Thread(task)17 workerThread[#19,Thread-0,5,main].start()1819 val score→ 22 = task→ ⟨FutureTask B⟩[Completed normally].get()20 println("base=" + base12)21 println("score=" + score22)22 }23}outputbase=12 score=22