Java 멀티스레딩을 사용하면 작업을 동시에 실행할 수 있어 성능과 응답성이 향상됩니다. 전통적으로 개발자는 Runnable 인터페이스를 사용하여 작업을 정의했지만 두 가지 주요 제한 사항이 있습니다. 즉, 결과를 반환할 수 없고 확인된 예외를 발생시킬 수 없습니다. 이러한 문제를 극복하기 위해 Java는 Java 5에 Callable 및 Future 인터페이스를 도입했습니다.
호출 가능 인터페이스
그만큼 호출 가능한 인터페이스 결과를 반환하고 예외가 발생할 수 있는 작업을 나타냅니다. Runnable과 유사하지만 값을 반환하고 확인된 예외를 발생시킬 수 있으므로 더 유연합니다.
Javaimport java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
산출
Result: 15
설명: 호출 가능 태스크가 실행자에게 제출됩니다. 1부터 5까지의 숫자의 합을 계산하여 결과를 반환합니다. 작업이 완료된 후 future.get()을 사용하여 결과를 검색합니다.
미래 인터페이스
그만큼 미래 인터페이스 비동기 계산의 결과를 나타냅니다. Callable 또는 Runnable 작업을 ExecutorService에 제출하면 Future 객체가 반환됩니다.
Javaimport java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
산출
Result: 30
설명: 그만큼Callable작업이 계산됩니다.10 + 2 and ExecutorService.submit()메소드는Future물체. 사용future.get()계산이 완료되면 결과를 얻습니다.
호출 가능 대 미래
| 특징 | 호출 가능 | 미래 |
|---|---|---|
| 목적 | 결과를 반환하는 작업을 나타냅니다. | 비동기 작업의 결과를 나타냅니다. |
| 반환 유형 | 실행되면 결과를 반환합니다. | Callable이 반환한 결과를 보유합니다. |
| 정의됨 | java.util.concurrent 패키지 | java.util.concurrent 패키지 |
| 실행 | ExecutorService에 제출됨 | ExecutorService.submit()에 의해 반환됨 |
| 행동 양식 | 하나의 메소드 call()이 있습니다. | get() isDone() cancel()과 같은 메소드가 있습니다. |
| 예외 처리 | 확인된 예외를 발생시킬 수 있음 | 실행 후 결과 및 예외 처리 |
| 용법 | 무엇을 실행할지 정의합니다. | 모니터링을 제어하고 작업 결과를 검색합니다. |