Java에서 "Future"는 비동기 작업의 결과를 나타내는 인터페이스입니다. 즉, Future 객체를 사용하면 작업을 시작하고 결과를 얻기 위해 블로킹*하지 않고 다른 작업을 수행할 수 있습니다.
*블로킹(Blocking)
한 작업이 완료될 때까지 다른 작업을 중지시키는 것
Java에서 "Future"는 비동기 작업의 결과를 나타내는 인터페이스입니다. 즉, Future 객체를 사용하면 작업을 시작하고 결과를 얻기 위해 블로킹*하지 않고 다른 작업을 수행할 수 있습니다.
*블로킹(Blocking) : 한 작업이 완료될 때까지 다른 작업을 중지시키는 것
Future 인터페이스는 작업의 상태를 확인하고 작업이 완료되면 결과를 얻을 수 있는 기능을 제공합니다.
Future를 사용하기 위해서는 비동기 작업을 생성하고 Future 객체를 통해 상태 및 결과를 추적해야 합니다.
여기에는 Future 인터페이스의 메서드를 사용할 수 있습니다. 주요한 메서드는 다음과 같습니다:
- boolean isDone(): 작업이 완료되었는지 여부를 확인합니다.
- boolean cancel(boolean mayInterruptIfRunning): 작업을 취소합니다.
- boolean isCancelled(): 작업이 취소되었는지 여부를 확인합니다.
- V get() throws InterruptedException, ExecutionException: 작업의 결과를 가져옵니다. 작업이 완료될 때까지 블로킹됩니다.
- V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException: 작업의 결과를 가져옵니다. 최대 지정된 시간까지 기다립니다.
Java에서 Future 인터페이스에는 비동기 작업의 결과를 설정하는데 사용되는 complete() 메서드가 있습니다. 이 메서드를 사용하면 Future 객체를 반환한 코드에서 작업 결과를 설정할 수 있습니다.
예를 들어, 다음과 같이 Future 객체를 반환하는 메서드를 작성할 수 있습니다.
import java.util.concurrent.*;
public class Example {
public static void main(String[] args) throws Exception {
// 비동기 작업을 수행할 ExecutorService 생성
ExecutorService executor = Executors.newSingleThreadExecutor();
// Future 객체 생성
Future<Integer> future = executor.submit(new Callable<Integer>() {
public Integer call() throws Exception {
// 비동기 작업 수행
return 42;
}
});
// 비동기 작업 결과 가져오기
int result = future.get();
System.out.println(result); // 42
// ExecutorService 종료
executor.shutdown();
}
}
이 메서드는 비동기 작업을 수행하고 Future 객체를 반환합니다.
그런 다음 호출하는 코드에서 Future 객체의 get() 메서드를 사용하여 비동기 작업의 결과를 가져올 수 있습니다.
하지만 만약 Future 객체의 결과를 이미 알고 있다면,
complete() 메서드를 사용하여 Future 객체의 결과를 설정할 수 있습니다.
예를 들어, 위의 doAsyncWork() 메서드에서 Future 객체를 반환하기 전에 비동기 작업의 결과를 이미 알고 있다면,
다음과 같이 complete() 메서드를 사용하여 Future 객체의 결과를 설정할 수 있습니다.
import java.util.concurrent.*;
public class Example {
public static Future<Integer> doAsyncWork() {
ExecutorService executor = Executors.newSingleThreadExecutor();
FutureTask<Integer> future = new FutureTask<>(new Callable<Integer>() {
public Integer call() throws Exception {
// 비동기 작업 수행
return 42;
}
});
// 비동기 작업 결과 설정
future.complete(42);
executor.shutdown();
return future;
}
}
FutureTask 클래스를 사용하여 Future 객체를 생성합니다.
그리고 complete() 메서드를 사용하여 Future 객체의 결과를 설정합니다.
이렇게 하면 get() 메서드를 호출하여 비동기 작업의 결과를 가져오는 대신, 즉시 Future 객체의 결과를 얻을 수 있습니다.
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] JAVA Exception 에러 출력 (0) | 2023.04.26 |
---|---|
[JAVA] java.net.Socket (0) | 2023.03.10 |
[JAVA] System.exit()은 무엇일까? (0) | 2023.03.10 |
[JAVA] Logging이란? (0) | 2023.03.10 |
[JAVA] JavaBean이란 (0) | 2023.03.10 |