2013-02-18 7 views
0

나는 비교적 새로운 자바 멀티 스레딩 및 동시성 도구을 사용하고 있습니다. 나는 이벤트 프로듀서 (EventProducer라고 부르 자)가있는 앱을 구현 중이다. EventProducer에는 스레드 풀 FixedThreadPool이 있습니다. 여기서 처리 할 이벤트 당 하나의 새 스레드가 전송되어 새로운 EventProcessor 스레드를 풀에 제출합니다.자바 멀티 스레드 통신

이벤트가 완료되면 풀의 스레드가 생성되고 있습니다. 그러나 문제는 애플리케이션 범위가 될 것으로 예상되는 두 개의 스레드로 각각 EventProcessor 개의 스레드 (각 이벤트 요청에 따라 다름)를 전달하고자한다는 것입니다. 즉, 애플리케이션의 인스턴스 만 가질 테니, Service1Service2. 둘 다 스레드 풀을 가지고있어 동시에 작업을 처리 할 수 ​​있습니다.

특정 EventProcessor은 작업 집합을 Service1으로 보내고 각 작업에 대한 응답을 반환합니다. 그 대답 들어, 나는 CompletionService을 찾았지만, 나는 그것을 양방향 통신을 위해 Blocking queues과 어떻게 통합시킬 수 있을지 모른다. 그 응답에 따라 EventProcessorService2에서 실행하기 위해 하나의 액션이나 다른 액션을 보냅니다. Service2은 해당 작업에 대한 응답을 EventProcessor에게 보낼 것입니다.

아무도 내가 그런 문제를 어떻게 해결할 수 있는지 알고 있습니까? 첫 단계를 수행하려면 소개가 필요합니다. 아이디어 풀기.

+0

@ jtahlborn, 귀하의 의견은 실제로 그/그녀의 문제에 어떤 가치도 추가하지 않습니다! –

+0

@jtahlborn 나는 몇 시간 동안 그 예를보고 있었고, 여기에 글을 쓸 수있는 구체적인 문제를 만들려고 노력했다. –

+0

@ user717630 사실, 그렇습니다. OP는 각 이벤트에 대해 새로운 스레드를 생성하려고합니다. 그의 스레드 Service1과 Service2에는 스레드 풀이 있습니다. 어쩌면 여기에 몇 가지 용어를 혼동시킬 수도 있습니다. –

답변

1


마지막으로 나는 다음과 같은 방법으로 그것을 해결하기 위해 관리 : EventProducer은 실행 가능한 객체 서비스 Service1Service2를 생성하고 스레드로 실행됩니다. 이 서비스들 각각은 CompletionService으로 구현 된 풀에서 결과를 기다립니다. 이러한 서비스 참조는 EventProducer에 보관되며 이벤트가 시작될 때마다 생성되는 EventProcessor에 대한 참조로 전달됩니다.

EventProcessor에는 두 개의 BlockingQueue 요소가 있으며, 각 요소는 서비스에서 응답을받는 데 사용됩니다. 서비스를 호출 할 때 객체의 참조를 통해 물음표를 처리하고 서비스의 디스패치 메소드를 호출하여 매개 변수로 처리하려는 요소 컬렉션과 함께 EventProcessor 참조를 전달합니다. 호출은 스레드 EventProcessor에 이어 수행되지만 처리 할 객체 당 호출 가능한 객체 만 생성하여 코드를 서비스 클래스로 실행하고 새 스레드를 자신의 풀에 전송합니다.

결과가 주어지면 자신의 스레드에서 대기중인 서비스가 참조 번호가 있기 때문에 BlockingQueueEventProcessor에 넣습니다. EventProcessor은 결과를 자신의 스레드로 관리하고 다른 작업에 다른 작업을 보낼 수 있습니다.

모든 사람들이 도움을 주셔서 감사합니다. 모든 대답이 나에게 어떤 개념을 분명히 해 주었기 때문에 당신은 상향 투표를했습니다.

3

스레드 간 통신을위한 최상의 개체는 BlockingQueue입니다. 그들은 매우 유연하고 스레드 안전하며 일반적으로 모든 요구 사항을 처리합니다.

BlockingQueue<Task> queue = new LinkedBlockingQueue<>(); 
1

서비스 1과 2는 ExecutorService입니다. EventProcessor는 응답을 캡슐화하는 리턴 유형 R을 사용하여 Callable 형식의 태스크를 Service1로 보냅니다. 또한 결과 선물을 대기열에 둡니다. 다른 스레드에서는 이러한 응답을 받고 Service2에 새로운 호출 가능 파일을 전달합니다. 또한 CompletionService를 사용할 수도 있습니다.

+0

그래서 제안서는 새로운 요청을 'Service2'로 보내는 다른 스레드를 만들고 있습니까? 그 일을하기 위해'EventProcessor'를 사용하지 않는 것이 최선의 방법이라고 생각하십니까? –

+0

처리 파이프 라인이있는 것 같습니다. 작업은 EventProcessor, Service1, Service2 순으로 처리됩니다. 이 * 아마도 * 다른 스레드에 의해 처리되어야합니다. 또한 Service1 작업을 Runnables로 래핑하여 Eventprocessor에 대한 새 이벤트를 만들고 원래 작업과 동일한 대기열에 넣을 수 있습니다. 그러나 Service1과 Service2는 무엇을 결정해야합니다. –

1

이벤트 디스패처 스레드에 비 차단 대기열이있는 경우 (예 : ConcurrentLinkedQueue)? 그런 다음 해당 참조를 Callable에 전달하여 응답을 대기열에 추가 할 수 있습니다.
이벤트 디스패처에서 주기적으로 대기열을 폴링하여 흥미로운 것이 있는지 확인할 수 있습니다. 대기열이 비 차단 상태이므로 비어있는 경우에만 null을 반환합니다.