[Java/Kotlin] Runnable & Callable

Jay·2021년 3월 12일
0

Java&Kotlin

목록 보기
22/30
post-thumbnail

Thread는 Runnable과 Callable의 구현된 함수를 수행한다는 공통점이 있다.

차이점도 있다.

  • Runnable : 어떤 객체도 리턴하지 않는다. Exception 없다.
  • Callable : 특정 타입의 객체를 리턴한다. Exception을 발생시킬 수 있다.

Runnable

  • 인자가 없고 리턴 값이 없다.
  • Thread에 인자로 바로 전달 할 수 있다.
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();
    }
}

Callable

  • 인자를 받지 않으며 특정 타입의 객체를 리턴한다.
  • call() 메소드 수행 중 Exception을 발생시킬 수 있다.
  • 다른 스레드에 의해 실행되어 질 수 있는 클래스의 객체를 위한 interface
  • Runnable처럼 바로 Thread에 인자로 전달할 순 없다.
    그래서 FutureTask를 사용한다.
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());
    }
}
profile
developer

0개의 댓글