
Callable은 Runnable과 매우 유사하다. 구현된 함수를 수행한다는 공통점이 잇지만, Runnable은 객체 반환형이 void 인 반면, Callable은 특정 타입의 객체를 리턴 받을 수 있습니다.
fun main() {
val thread = Thread{
println("Called at : ${LocalTime.now()}")
}
thread.start()
}
// Called at : 09:32:20.260042
class MyCallable: Callable<String> {
override fun call(): String {
return "Called at : ${LocalTime.now()}"
}
}
@Throws(ExecutionException::class, InterruptedException::class)
fun main() {
val callable = MyCallable()
val futureTask = FutureTask(callable)
val thread = Thread(futureTask)
thread.start()
println(futureTask.get())
}
// Called at : 09:32:20.260042
Thread는 FutureTask를 통해서 Callable을 호출합니다. FutureTask.get() 으로 Callable의 call 메소드가 호출되어 결과가 리턴되기를 기다립니다.
futureTask.get() 할 때 값을 가져오는 것이 아닌 thread.start 때 이미 실행하고 futureTask.get()으로 가져올 수 있다.
Thread(Runnable target)으로 target 필드에 저장하고


FutureTask의 구현체를 보면 start를 하게 되면 call() 을 호출하고 result 변수에 담는 것을 확인할 수 있다. 실행된 결과를 set 메소드로 저장. set 메소드는 outcome 필드에 결과를 저장한다.
