2012-04-28 3 views
1

순차 멀티 쓰레드 메시지 처리에 대한 일반적인 접근법은 무엇입니까?

다음 예를 고려하십시오. 대기열에 숫자를 보내는 게시자가 있습니다. 1, 2, 3, 4, 5, 6, 7

내 목표는 확률 및 평균을 순차적으로 처리하는 것입니다.

가능한 해결책 중 하나는 스레드 당 별도의 대기열을 사용하고 n % m 기준에 따라 원본을 분할하는 것입니다.

내가 걱정하는 점은 숫자가 고르지 않게 분산 될 수 있다는 사실이며 적은 스레드만으로 끝낼 수 있다는 것입니다.

같은 조건을 가진 대기열 요소가 다른 스레드에 의해 처리되고 있는지 확인하는 사용자 정의 대기열을 구현할 생각이 있습니다. 다른 대기열을 찾으려고 시도합니다. 그게 효과가 있을지 모르지만, 뭔가 구현하려고 시도했지만 복잡해지고 테스트하기가 더 어렵습니다. 그래서 내가 먼저 문제에 대한 기존 해결책을 찾으려고 노력합니다.순차 멀티 쓰레드 메시지 처리

+0

당신이 반드시 멀티 스레딩 필요하십니까 : 당신이 대답처럼 BlockingQueues에서 & ExecuterServices을보고 할 수 있습니다 이론적 인 부분을 넘어

? 첫 번째와 오즈가 마지막 인 evens로 목록을 정렬 할 수 있다면 작동할까요? assylias가 말했듯이, 만약 당신이 스레드가 어떻게 작동하는지 알려 주시면됩니다. 도움이 될 것입니다 –

+0

예이 솔루션의 실제 응용 프로그램은 숫자가 아닌 많은 양의 데이터를 처리해야하므로 멀티 스레딩이 필요합니다. 문제를 쉽게 설명 할 수 있도록 숫자를 사용했습니다. –

답변

1

댓글에 대한 답변이 너무 길지만 댓글을 달려면 너무 길어요.

내 목표는 확률과 강세를 순차적으로 처리하는 것입니다.

그런 경우에는 확률에 대해 하나의 스레드와 1 개의 값으로 하나의 스레드를 가질 수 없습니다. 순차적 실행이 필요한 이유가 있습니까? 의 결과를 사용하여 process(4)을 실행합니까?

내가 걱정하는 것은 숫자가 고르게 분산 될 수 있으며, 내가 할 수있는 작은 일이 몇 가지 스레드로 끝날 것이라는 사실이다.

아마도 그렇지만 순차적 제약 조건을 위반하지 않고 어떻게 유휴 스레드에 더 많은 작업을 배포 할 수 있습니까?

+0

문제를 설명하기 위해 예제로만 숫자를 사용했습니다. 실제로 얼마나 많은 그룹이나 유형을 가지고 있는지 알 수 없습니다. 나는 JMS 대기열에서 메시지를 소비한다. 독립적 인 메시지는 동시에 처리 할 수 ​​있지만 다른 메시지 유형 (취소, 수정)은 도착 순서대로 처리해야합니다. –

0

유형이 2 개인 경우 각각 유형별로 처리해야하므로 2 개의 스레드 만 가질 수 있습니다. 처리 할 다른 유형의 메시지가 없으면 하나의 스레드 만 작동 할 수 있습니다.

이 경우 2 개의 대기열을 사용하고 유형에 따라 메시지를 넣으십시오. & 각 스레드가 하나의 대기열을 사용하게하십시오. 세 번째 스레드를 사용하여 메시지를 배포 할 수 있지만 한 스레드가 전체 대기열을 갖고있는 경우 각 유형을 개별적으로 요청하거나 메시지를 버릴 수있는 방법이없는 한 원래 제작자가 보낸 메시지를 사용할 때까지 기다려야합니다. 여기서 당신은 자신의 제한에 의해 제한됩니다. Producer/Consumer threads using a Queue

+0

Producer/Consumer 패턴을 알고 있지만 Queue 및 ExecutorService의 기존 구현은 독립 데이터의 멀티 스레드 처리에만 적합합니다. –

+0

그래서 동적 스레드 + 대기열 풀의 종류가 필요합니다. 다른 유형의 메시지에 스레드를 재사용 할 수 있습니까? – zapl

+0

나는 현재 처리중인 요소 유형을 확인하고 그렇지 않은 요소를 확인할 수있는 사용자 정의 대기열 구현을 고려하고있었습니다. 처리되지 않는 그룹은 빈 스레드에 의해 대기열에서 제외 될 수 있습니다. –