스레드 풀(2)
2022. 5. 7. 20:03ㆍ카테고리 없음
*블로킹 방식의 작업 완료 통보 받기
1) Future
- 작업 결과가 아니라 지연완료객체 (submit 메서드 호출 즉시 future가 바로 리턴 하지만 작업 완료된 결과값이 들어 있는 게 아님)
- 작업이 완료될때까지 기다렸다가 최종 결과를 얻기 위해서 get()메서드 사용
-Future의 get()은 UI스레드에서 호출하면 안된다.
UI를 변경하고 이벤트를 처리하는 스레드가 get() 메서드를 호출하면
작업을 완료하기 전까지는 UI를 변경할 수도 없고 이벤트도 처리할 수 없게 된다.
- 다른 메소드
2)리턴값이 없는 작업 완료 통보
Runnable task = new Runnable() {
public void run() {
// 스레드가 처리할 작업 내용
}
}
Future future = excutorService.submit(task);
try {
future.get();
} catch (InterruptedException e) {
//작업 처리 도중 스레드가 interrupt 될 경우 실행할 코드
} catch (ExecutionException e) {
//작업 처리 도중 예외가 발생된 경우 실행할 코드
}
3)리턴값이 있는 작업 완료 통보
Callable<T> task = new Callable<T>() {
public T call() throws Exception {
//스레드가 처리할 작업 내용
return T;
}
}
Future<T> future = executerService.submit(task)
try{
T result = future.get();
} catch (interruptedException e) {
//작업 처리 도중 스레드가 interrupt 될 경우 실행할 코드
} catch (ExecutionException e) {
//작업 처리 도중 예외가 발생된 경우 실행할 코드
}
4) 작업 처리 결과를 외부 객체에 저장
-스레드 1에서 처리한 결과 + 스레드 2에서 처리한 결과
Result result = ...;
Runnable task = new Task(result); //매개변수로 결과값을 참조할 result를 Runnable객체에 전달
Future<Result> future = executorSerivice.submit(task, result);
result = future.get()
class Task implements Runnable {
Result result; //공유객체를 필드에 선언된 result에 저장
Task(Result result) { this.result = result; }
@Override
public void run() {
//작업 코드
//처리 결과를 result에 저장
}
}