현장에서 ThreadPool을 사용할 때 가장 많이 사용하는 것이 Spring에서 내장하고 있는 클래스들이다.

그런데 이 클래스들을 뜯어서 보니 Java에서 기본으로 제공하는 interface나 class와는 구조나 모임의 단위가 조금 달라보인다. google을 아무리 찾아봐도 만족할 만한 답이 없어서 시간이 나는동안 소스를 열어봤다.

가장 많이 사용하는 클래스들을 뽑아서 diagram을 그려봤다.

왼쪽에 Spring, 오른쪽이  Java이다.


1. Java

Java의 Concurrent 패키지에서는 순수하게 기능에 집중해서 작성한 것으로 보인다.

쉽게 가져가서 사용할 수 있는 구조를 위해서 많이 노력한 것으로 보이며 ISP의 원칙을 잘 지킨 것 같다.


a. Executor : Runnable 구동이 가능하며 execute 메소드를 사용한다.

b. ExecutorService : Executor를 상속받았다. Callable 구동이 가능하며 추가적으로 submit 메소드를 제공한다.

ThreadPool의 lifecycle에 관련된 메소드도 보인다.

c. ThreadPoolExecutor : 실제 개발자가 ThreadPool 사용을 위해서는 ThreadPoolExecutor를 생성해서 사용하며,

이를 좀 더 쉽게 사용할 수 있도록 Util성클래스인 Executors 를 제공한다.

d. ScheduledExecutorService : Schedule작업을 위한 인터페이스로 schedule 메소드가 정의되어 있다.



2. Spring

Spring의 경우에는 좀더 사용자의 측면에 접근해서 설계가 되어있는 모습이다.

내부구현은 Java에서 제공하는 class들을 멤버변수로 가지고 있어서 대부분 처리를 진행하고,

사용자가 좀더 편리하게 사용할 수 있도록 다양한 설정포인트를 제공한다.

Thread작업에 task라는 개념을 도입하여 재구성한 형태로 그 출발은 TaskExecutor이다.


a. TaskExecutor : java의 Executor와 완전히 동일하다. Spring에서의 확장을 위해서 만들었다.

b. SyncTaskExecutor : Runnable의 run메소드를 호출만 한다.

c. AsyncTaskExecutor : Runnable과 Callable의 구동이 가능하며, execute 메소드와 submit 메소드를 제공한다.

d. TaskScheduler : Schedule작업을 위한 인터페이스로 scheduler 메소드가 정의되어 있다.


이러한 각 인터페이스를 용도에 맞게 구현하여 아래의 클래스 형태들로 제공하고 사용자는 자신의 목적에 맞도록 선택하여 사용한다.


또한 Spring에서는 Future의 확장을 위해서 ListenableFuture를 별도로 정의하여 사용하고 있다.

이부분은 다음에 시간날때 보도록 해야겠다...



+ Recent posts