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
*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 |