우리는 약간의 문제가있었습니다. :)수행 할 작업 트리가있는 ExecutorService 사용
언제든지 N 개의 스레드 만 백그라운드 작업을 수행하도록하고 싶습니다. 이를 위해 고정 스레드 풀 실행 프로그램을 사용했습니다. 그것은 잘 작동하는 것 같았다.
그런 다음 문제가 발견되었습니다. 집행자를 사용하여 일부 병렬 작업을 수행하는 클래스가 있고 다른 병렬 처리를 수행하는 executor 스레드에서 다른 클래스를 호출한다고 가정하십시오. 여기에 일어나는 내용은 다음과 같습니다
- 메인 스레드는 첫 번째 수준의 메소드를 호출합니다.
- 이 방법은 16 개의 작업으로 병렬 처리하여 작업을 분할 할 수 있다고 생각합니다.
- 16 개의 태스크가 집행자에게 제출됩니다.
- 주 스레드가 완료 될 때까지 대기하기 시작합니다.
- 사용할 수있는 스레드가 4 개인 경우 처음 네 개의 작업이 각각 선택되어 실행됩니다. 따라서 대기열에는 12 개의 작업이 남아 있습니다.
- 이제 이러한 작업 중 하나는 다른 방법을 호출합니다.
- 이 새로운 방법은 2 가지 작업으로 병렬 처리 할 수 있다고 생각합니다. 병렬 병합 정렬의 첫 번째 단계라고 가정 해 보겠습니다.
- 2 개의 태스크가 집행자에게 제출됩니다.
- 이 스레드는 이제 해당 작업이 완료 될 때까지 대기하기 시작합니다.
어 - 오. 따라서이 시점에서 네 개의 모든 스레드는 작업이 완료 될 때까지 기다리고 있지만 실제로 작업을 실행하는 executor를 공동으로 차단합니다.
해결책 1은 executor에 새로운 태스크를 제출할 때 이미 모든 스레드를 실행 중이며 이미 executor 스레드 중 하나에서 실행 중이면 작업을 인라인으로 실행합니다. 이것은 10 개월 동안 정상적으로 작동했지만 지금은 문제가 발생했습니다. 제출하는 새 작업이 여전히 비교적 큰 경우 새 작업이 메서드가 다른 작업을 대기열에 추가하는 것을 차단하는 상황에 빠지게 될 수 있습니다. 다른 작업은 다른 작업자 스레드에 의해 선택 될 수 있습니다. 따라서 스레드가 작업을 인라인으로 처리하는 동안 엄청난 지연이 발생할 수 있습니다.
잠재적으로 제한되지 않는 백그라운드 작업 트리를 실행하는 핵심 문제에 대한 더 나은 해결책이 있습니까? 나는 Executor 서비스와 동등한 .NET이 원래의 교착 상태 문제가 발생하지 않도록 대기열에서 도용 할 수있는 내장형 기능을 가지고 있음을 이해합니다. 이상적인 해결책이라고 할 수 있습니다. 그러나 Java 토지의 경우는 어떨까요?
그럼 당신들이 문제를 해결 했나요? 당신이 찾고 있던 답변이 있습니까? –