스크린샷 2022-01-14 오전 9.12.15.png

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 필드에 저장하고

스크린샷 2022-01-27 오전 10.57.07.png

스크린샷 2022-01-27 오전 10.59.53.png

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

스크린샷 2022-01-27 오전 11.02.38.png