java

[java] ExecutorService 와 Runnable, Callable을 통한 async (기초 예제 + 매우 기초 지식)

Mussyan 2021. 5. 28. 14:44

자바에서 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초 만큼의 시간이 걸리겠지만

위와 같이 호출하면 각 스레드가 동시다발적으로 호출하게 된다.