안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ |
콜백이란 => 애플리케이션이 스레드에게 작업 처리 요청 후 스레드가 요청받은 작업을 완료하면
특정한 메소드를 자동 실행하는 기법을 말합니다.
이 때에 자동으로 실행되는 메소드를 콜백 메소드라고 하는 것입니다.
블로킹 방식과 콜백 방식 비교
블로킹방식은 작업 처리 요청 후 작업이 완료될 때까지 블로킹 됨.
콜백 방식은 작업 처리 요청 후 결과를 기다릴 필요없이 다른 기능 수행 가능.
=> 작업 처리가 왼료되면 콜백 메서드가 실행되어 자동적으로 결과를 알 수있기 때문입니다.
ExecutorService에서는 별도로 콜백을 위한 메소드를 제공하지 않지만
Runnable 구현 클래스 작성 시 콜백 기능 구현 가능.
먼저 콜백 메소드를 가진 클래스가 있어야함.
직접 정의해도 되고, java.nio.channels.CompletionHandler를 이용해도 좋습니다.
이 인터페이스는 NIO 패키지에 포함되어 있고, 비동기 통신에서 콜백 객체를 만들 때 사용됩니다.
CompletionHandler 객체 생성 코드
CompletionHandler<V, A> callBack = new CompletionHandler<V, A>() {
@Override
public void completed(V result, A attachment) {
//작업 처리가 정상적으로 완료됐을 경우 호출
}
@Override
public void failed(Throwable t, A attachment) {
// 작업 처리 도중에 예외가 발생했을 경우 호출
}
V 타입의 매개값은 결과값의 타입, A는 첨부 값의 타입.
첨부값이란 => 콜백 메서드에 결과값 이외에 추가로 전달하는 객체
첨부값이 없을 경우에는 Void로 지정
작업 처리 결과에 따라 콜백 메소드를 호출하는 Runnable 구현 객체
Runnable task = new Runnable() {
@Override
public void run() {
try {
V result = ~~~;
callback.completed(result, null);
} catch(Exception e) {
callback.failed(e, null);
}
}
};
예제
import java.nio.channels.CompletionHandler;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
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("2", "2");
example.doWork("3", "둘");
example.finish();
}
}
이상입니다!