2014-12-16 8 views
1

맞춤 비즈니스 요구 사항이 있습니다. 일련의 서비스 요청을 실행해야합니다. 이러한 각각의 호출은 데이터베이스에 새로운 레코드를 작성합니다. 새 서비스 호출은 이전 서비스 호출로 DB에 작성된 레코드를 입력 매개 변수로 사용하기 때문에 이전 서비스 호출이 완료된 후에 만 ​​다음 서비스 호출을 실행해야합니다.Java Executor는 이전 작업이 완료된 후에 하나의 Callable을 실행합니까?

나는 미래의 작업에서 이러한 서비스 호출을 각각 포장 한 다음 Executors.newSingleThreadExecutor()을 사용하여 이러한 작업을 루프로 실행하기로 결정했습니다.

충분하지 않더라도 더 나은 해결책을 제안 하시겠습니까 ??

또한 다음 작업을 실행하기 전에 task.isDone()을 배치해야합니까 ??

+1

"* 각각의 작업은 이전 작업이 완료된 후에 실행되어야합니다. *"이것은 나쁜 패턴처럼 들리 - '미래'는 일반적으로 서로 의존하거나 특정 순서로 실행되어야합니다. – dimo414

+0

@ dimo414 ......이 비즈니스 목표를 달성하는 데 더 좋은 패턴을 제안 하시겠습니까 ?? –

+0

'미래'는 결국 * 끝내는 작업 단위가되도록 의도 된 것이며, 그런 다음에는 그 일이 생기면 그걸로 무언가를합니다. 당신은 그 요구 사항을 가지고 있지 않지만 당신의 다른 요구 사항들이 무엇인지 말하지 않았기 때문에 말하기 어렵습니다. 나는'List '에 대한 for-loop가 정상적으로 동작 할 것이라고 생각한다. 그렇지 않은 경우 기본 비즈니스 요구 사항이 무엇인지 완전히 설명하는 또 다른 질문을 올리십시오. 누군가 적절한 도구를 제안 할 수 있습니다. – dimo414

답변

2

나는 Executors.newSingleThreadExecutor()를 사용하기로 결정했습니다.

귀하의 요구 사항을 고려하여 선택하십시오.

만약 그렇다면 더 좋은 해결책이 되겠습니까?

예, 그렇습니다. 표준 JDK 라이브러리를 사용하면이 방법이 가장 좋습니다.

또한 다음 작업을 실행하기 전에 task.isDone()을 배치해야합니까 ??

아니요.이 실행자의 javadoc에는 "[...] 작업이 순차적으로 실행되도록 보장되며 주어진 시간에 둘 이상의 작업이 활성화되지 않는다고 명시 적으로 명시되어 있습니다."

따라서 이전에 활성화 된 작업이 종료되기 전에는 작업이 시작되지 않습니다. 유언 집행자에게 물건을 담아두면 물건을 다룰 수 있습니다.