Backend/JAVA

Callable, Runnable, Future

dddzr 2024. 6. 5. 15:54

Runnable과 Callable은 둘 다 자바에서 멀티스레딩을 구현할 때 사용되는 인터페이스입니다.

두 인터페이스는 스레드가 수행할 작업을 정의하며, ExecutorService와 같은 스레드 풀에서 관리되고 실행될 수 있습니다.

Runnable

  • Runnable 인터페이스는 자바에서 멀티스레딩을 구현하기 위한 기본 인터페이스입니다.
  • run 메서드를 하나만 가지고 있으며, 예외 처리와 반환값이 없습니다. (Future.get()을 호출하면 null을 반환)
  • 간단한 비동기 작업을 수행할 때 유용합니다. (ex. UI 스레드에서 백그라운드 작업을 수행, 타이머 작업)
  • 메서드: void run()
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Executing task in MyRunnable");
    }

    public static void main(String[] args) {
        // Runnable 구현체 생성
        MyRunnable myRunnable = new MyRunnable();

        // 스레드 생성 및 시작
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

 

Callable

  • 작업이 완료된 후 결과를 반환할 수 있으며 예외를 던질 수 있습니다.
  • Callable 인터페이스는 call 메서드를 가지고 있으며, 제네릭 타입을 사용하여 반환값의 타입을 지정할 수 있습니다. (Future.get()을 호출해서 반환값 확인 가능.)
  • 복잡한 비동기 작업을 수행하고 결과를 받아야 할 때 유용. (ex. 계산 작업, 파일 읽기/쓰기 작업 등 시간이 오래 걸리고 결과가 필요한 작업)
  • 메서드: V call() throws Exception
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "Result from MyCallable";
    }

    public static void main(String[] args) {
        // Callable 구현체 생성
        MyCallable myCallable = new MyCallable();

        // 스레드 풀 생성
        ExecutorService executorService = Executors.newFixedThreadPool(1);

        // Callable 작업 제출 및 Future 반환
        Future<String> future = executorService.submit(myCallable);

        try {
            // Callable 작업의 결과를 얻기
            String result = future.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        // 스레드 풀 종료
        executorService.shutdown();
    }
}

 

 

Callable, Runnable과 함께 알아야 할 개념입니다.

*스레드 풀, executors

https://sumni.tistory.com/337

 

*Future 객체

  • Future 객체는 비동기 작업의 결과를 나타냅니다.
  • 메서드
    • Future.get(): 작업이 완료될 때까지 대기하고 결과를 가져올 수 있습니다.
    • Future.cancel(boolean mayInterruptIfRunning):작업을 취소.
    • Future.isDone(): 작업이 완료되었는지 여부를 반환.
    • Future.isCancelled(): 작업이 취소되었는지 여부를 반환합니다.

 

'Backend > JAVA' 카테고리의 다른 글

HttpURLConnection  (0) 2024.06.07
블록킹큐(Blocking Queue)  (0) 2024.06.05
스레드 풀(Thread Pool), Executor  (0) 2024.06.05
[Java] java.lang 패키지의 System  (0) 2023.10.12
JAVA에서 html 다루기 (Jsoup)  (0) 2023.08.16