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

base
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)
  }
}
  1. 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()
  2. 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
  1. 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()
  2. 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
  1. 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()
  2. 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