Thread는 Runnable과 Callable의 구현된 함수를 수행한다는 공통점이 있다.
차이점도 있다.
public interface Runnable {
public abstract void run();
}
Runnable을 사용하는 예제.
Thread는 Runnable을 인자로 받고 실행한다.
어떤 값도 리턴 하지 않으며, Runnable의 run() 메소드에 정의된 코드를 수행한다.
package utils;
import java.time.LocalTime;
public class RunnableExample1 {
static class MyRunnable implements Runnable {
@Override
public void run() {
String result = "Called at " + LocalTime.now();
System.out.println(result);
}
}
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
}
public interface Callable<V> {
V call() throws Exception;
}
Thread는 FutureTask를 통해 Callable을 호출한다.
FutureTask.get()으로 Callable의 call() 메소드가 호출되어 결과가 리턴되기를 기다린다.
package utils;
import java.time.LocalTime;
import java.util.concurrent.*;
public class CallableExample1 {
static class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
String result = "Called at " + LocalTime.now();
return result;
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable callable = new MyCallable();
FutureTask futureTask = new FutureTask(callable);
Thread thread = new Thread(futureTask);
thread.start();
// 결과가 리턴되기를 기다립니다.
System.out.println("result : " + futureTask.get());
}
}