자바에서 async를 구현하는 데에는 여러 방법이 있을 것이다.
그 중 한가지 방법인 executorService와 Runnable, Callable에 대한 매우 간략한 예제와 더 간략한 설명.
Runnable 혹은 Callable을 implements 하는 클래스를 생성한다.
둘의 공통점 및 차이점은 대략 아래와 같다.
Runnable | Callable |
인자를 받아서 활용 가능 executorService와 함께 활용하여 async한 동작 구현 가능 |
|
run 메소드 override | call 메소드 override |
run 메소드는 리턴값이 없음 | call 메소드는 원하는 형태로 리턴 가능 |
아래는 runnable 예시.
public class AsyncTest {
public static class Runner implements Runnable {
String value;
public Runner(String value) {
this.value = value;
}
@Override
public String run() {
log.info("called!");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
log.info("finished!");
}
}
}
위 클래스를 executorService를 활용하여 아래와 같이 호출.
//newCachedThreadPool 도 있음. 스레드 개수를 고정적으로 운용한다면 Fixed, 가변적으로 운용한다면 Cached 사용이 적절
ExecutorService executor = Executors.newFixedThreadPool(10);
for(int i=0;i<5;i++) {
executor.submit(new AsyncTest.Runner("async"));
}
비동기로 실행한다면 반복 회수*1초 만큼의 시간이 걸리겠지만
위와 같이 호출하면 각 스레드가 동시다발적으로 호출하게 된다.
'java' 카테고리의 다른 글
java 리눅스 명령어 실행하기(processBuilder) (0) | 2021.05.21 |
---|