2011-11-11 3 views
3

내가 개발하는 소프트웨어가 크고 복잡해지기 시작한 것은 드문 일이 아니며 다양한 부분에서 집행자를 자신의 방식으로 사용합니다. 성능 측면에서 각 부분마다 다른 스레드 풀 구성을 사용하는 것이 좋습니다. 그러나 유지 보수성 및 코드 사용성 측면에서 스레드, 동시성 및 CPU 사용과 관련된 모든 사항이 중앙 집중식으로 유지되고 구성되는 것이 더 바람직합니다.집행자를 관리하는 방법

일부 동시 실행 또는 예약이 필요한 각 클래스가 자신의 스레드 풀을 만들면 수명주기 및 전체 스레드 수를 제어하기가 어렵 기 때문에 OK가 아닙니다. 정말 성능을 해칠 수 대기열 및 스레드 풀 크기를 작업의

ExecutorManager어떤 종류의 생성 및 응용 프로그램의 주위에 하나 개의 스레드 풀 중 하나 OK를 전달해서는 안됩니다, 때문에, 작업의 종류에 따라와 속도를 제출, 부적절하게 구성 조합 나쁜.

문제는 다음과 같습니다.이 문제를 해결하는 몇 가지 일반적인 방법이 있습니까?

+0

실제 문제는 구성 요소의 수명주기를 관리하는 간단한 방법을 찾은 것 같습니다. 간단한 방법으로 구성 요소를 관리하고 최소한의 스레드 만 만들면 아무런 문제가 없어야합니다. 입출력에 관해서 이야기하지 않는다면, 코어를 가지고있는 것보다 더 많은 스레드를 필요로하지 않을 것입니다. –

답변

2

큰 문제가 3 개 이상있는 동시 작업이있는 경우 실행하는 작업에 따라 다르게 구성 할 수있는 2 개 또는 3 개의 threadPools를 만듭니다.

필요에 따라 (예 : 이름으로) 풀을 주입 할 수 있으며, AOP (예 : aspectj)를 사용하여 특정 풀/실행 프로그램으로 정의 된 메소드를 실행하는 주석을 추가로 작성할 수 있습니다.

주석 분석자는 모든 pool/executor에 액세스 할 수 있어야하고 주석에 지정된 것을 사용하여 작업을 제출해야합니다. 예를 들어

: 당신이 찾고있는 무엇

@Concurrent ("pool1") 
public void taskOfTypeOne() { 
} 

@Concurrent ("pool2") 
public void taskOfTypeTwo() { 
} 
+0

감사! 그것이 내가 생각한 것입니다. 나는 봄 접근법도 유효하지만 :-)이 접근법을 고수 할 것입니다. – Kovalsky

1

의존성 삽입 (Dependency Injection) 또는 컨트롤의 반전이다. Java에서 가장 많이 사용되는 DI 프레임 워크 중 하나는 Spring입니다. 보통의 Java 객체를 만들지 만 특정 주석을 사용하거나 XML로 구성하여 연결합니다. 이 방법을 사용하면 서로 다른 ExecutorService 인스턴스를 한 곳에서 구성하고 해당 인스턴스가 필요한 클라이언트 클래스에 (이름으로) 주입되도록 요청할 수 있습니다.

+0

그래도 아직 충분히 깊이 파고 들지는 않았지만 거의 모든 시점에서 등을 맞댄 듯합니다. 단지 익숙해지며 모든 것을 설정하는 데는 시간이 걸리기 때문에 옵션이 있는지 궁금합니다. – Kovalsky