자바 쓰레드는 Runnable, Callable을 쓸 수 있다.
두개의 차이점이 궁금할 텐데 같이 한번 살펴보자.
간단한 예제로 빠르게 살펴봅니다.
class ThreadRunner implements Runnable{
public void run() { System.out.println("Runnable"); }
}
class ThreadCaller implements Callable{
public String call() throws Exception{
return "Callable";
}
}
public class Test{
public static void main(String[] args) throws InturruptedException, ExecutionException{
ExecutorService es = Executors.newSingleThreadExecutor();
Runnable r1=new ThreadRunner();
Callable c1=new ThreadCaller();
es.execute(r1);
es.execute(c1); //컴파일 에러. 파라미터로 callable이 왔기 때문에. execute는 runnable만 가능하다.
es.submit(r1);
es.submit(c1);
Future<String> f1=es.submit(c1);
//System.out.println(f1.get());
es.shutdown();
}
}
컴파일에러가 나는 es.execute(c1)을 주석처리 후 실행해보면 결과는
Runnable
Runnable
Callable
이렇게 출력될 것이다.
먼저 ExecutorService에 관해 설명하면
작업큐에 Runnable 혹인 Callable 객체를 넣는 행위이다.
작업처리 요청을 위해 execute(), submit() 메소드를 제공한다.
- execute() : Runnable을 작업큐에 저장
- submit() : Runnable 또는 Callable을 작업큐에 저장, Future 객체를 리턴
위의 내용만 이해하면 쉽다.
봤다시피 ExecutorService는 execute(), submit() 메소드를 제공하며 execute() 메소드는 Runnable만 파라미터로 사용할 수 있다.
그런데 es.execute(c1) 처럼 Callable을 파라미터로 쓰려고 했으니 컴파일 에러가 발생한다.
es.submit(r1) es.submit(c1) 은 정상이다. submit은 Runnable 및 Callable을 사용할 수 있다.
Callable을 제대로 사용하려면 리턴값을 받아서 써야 하니 Future을 사용해서 찍어보면 Callable의 정확한 사용법을 알 수 있다.