스레드 풀(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에 저장
    }
}