티스토리 뷰

자바 쓰레드는 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의 정확한 사용법을 알 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함