반응형
콜백 방식의 작업 완료 통보
자바스크립트를 조금해보면 콜백방식이 익숙할 것이다. 자바에서도 스레드 작업이 완료되면 특정 메소드를 자동 실행할 수 있는 콜백 방식을 이용할 수 있다.
블로킹 방식 <----> 콜백방식
ExecutorService는 콜백을 위한 기능을 제공하지 않는다. Runnable 클래스를 작성할 때 콜백 기능을 구현할 수 있는데 java.nio.channels.CompletionHandler를 이용해서 구현할 수 있다.(NIO 패키지 안에 존재, 비동기 통신에서 콜백 객체를 만들때 사용된다.)
CompletionHandler<K, V> callback = new CompletionHandler<V, K>(){
@Override
public void completed(V result, K attachment){} // 작업이 완료됬을시
@Override
public void failed(Throwable exc, K attachment){} // 도중 예외 발생시
}
Runnable task = new Runnable(){
@Override
public void run(){
try{
// 작업
V result = ..;
callback.completed(result, null);
}catch(Exception e){
callback.failed(e, null);
}
}
}
public class CallbackExample {
private ExecutorService executorService;
public CallbackExample(){
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
}
private CompletionHandler<Integer, Void> callback =
new CompletionHandler<Integer, Void>() {
@Override
public void completed(Integer result, Void attachment) {
System.out.println("실행 완료(completed) " + result);
}
@Override
public void failed(Throwable exc, Void attachment) {
System.out.println("실행 실패(failed) " + exc.toString());
}
};
public void doWork(final String x, final String y){
Runnable task = new Runnable() {
@Override
public void run() {
try {
int intX = Integer.parseInt(x);
int intY = Integer.parseInt(y);
int result = intX + intY;
callback.completed(result, null); // 성공
}catch(NumberFormatException e){
callback.failed(e, null); // 예외발생
}
}
};
executorService.submit(task);
}
public void finish(){
executorService.shutdown(); // 스레드풀 종료
}
public static void main(String[] args) {
CallbackExample example = new CallbackExample();
example.doWork("3", "3");
example.doWork("3", "삼");
example.finish();
}
}
실행 결과
실행 실패(failed) java.lang.NumberFormatException: For input string: "삼"
실행 완료(completed) 6
반응형
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] 동기화된 컬렉션(thread-safe collection), 병렬처리 가능한 컬렉션 (0) | 2019.03.20 |
---|---|
[JAVA] Comparable과 Comparator (0) | 2019.03.17 |
[JAVA] 블로킹 방식의 작업 완료 통보_2 (스레드풀_3) (0) | 2019.03.16 |
[JAVA] 블로킹 방식의 작업 완료 통보_1 (스레드풀_2) (0) | 2019.03.14 |
[JAVA] 스레드풀 생성, 종료 및 작업 처리 (스레드풀_1) (0) | 2019.03.14 |