내가 수행하는 방식은 작업 자체의 키가 무엇인지에 따라 스트림이 다른 스레드로 작동하도록하는 자체 생성 코드를 사용하는 것입니다 (이것은 완전히 임의적이거나 의미있는 값일 수 있음). Queue
에 제공하고 다른 스레드가 작동하지 않고 (또는 귀하의 경우 ExecutorService
으로 작업을 처리하고 내부 작업 대기열을 제거하는 스레드 풀을 유지 관리하는 서비스) 대신 Pipelineable
(일명 작업)을 PipelineManager
에 보내면 해당 작업의 키에 대한 올바른 대기열을 찾고 해당 대기열에 작업을 고정시킵니다. 동일한 키에 대해 제공되는 모든 작업이 연속적으로 실행되도록 보장하기 위해 대기열을 제거하는 스레드를 관리하는 여러 가지 코드가 있습니다.
이 접근법을 사용하면 n 개의 일련 작업에 대한 특정 키를 쉽게 설정하고 이전 순서로 갈 수있는 작업의 나머지 키들을 라운드 로빈 방식으로 처리 할 수 있습니다. 또는 특정 파이프 (스레드)를 현명하게 유지할 수 있습니다 키 선택. 그들은 (IS 적어도 ThreadPoolExecutor
) 단일 BlockingQueue
바탕 따라서 오래된 위해이 일을 "말할 수있는 방법은 없습니다 있기 때문에
이 방법은 JDK ExecutorService
구현 가능하지 않지만이 작품은해야합니다 연재 ". 나는 당신이 danben의 코멘트에 따라 singleThreadExecutor
에 모든 것을 집어 넣는 것만으로 처리량을 유지하기를 원한다고 가정하고 있습니다.
(편집) 같은 추상화를 유지하는 대신 무엇을 할 수 있는지
은의 많은 인스턴스 대표는 ThreadPoolExecutor
(또는 유사한) 당신이 필요로하는 ExecutorService
당신 자신의 구현을 만드는 만드는 것입니다; 1은 n 개의 스레드와 1 개 이상의 단일 스레드 인스턴스에 의해 지원됩니다.다음과 같은 뭔가 (어떠한 방식으로 모든 코드를 작동하는 그러나 희망 당신이 얻을 생각!)
public class PipeliningExecutorService<T extends Pipelineable> implements ExecutorService {
private Map<Key, ExecutorService> executors;
private ExecutorService generalPurposeExecutor;
// ExecutorService methods here, for example
@Override
public <T> Future<T> submit(Callable<T> task) {
Pipelineable pipelineableTask = convertTaskToPipelineable(task);
Key taskKey = pipelineable.getKey();
ExecutorService delegatedService = executors.get(taskKey);
if (delegatedService == null) delegatedService = generalPurposeExecutor;
return delegatedService.submit(task);
}
}
public interface Pipelineable<K,V> {
K getKey();
V getValue();
}
은 서비스 자체 반대로 ExecutorService
방법은 일반적인 것으로,이 목적을 위해, 꽤 추한하는 당신이 할 수 없다면 Pipelineable과 fallback으로 전달되는 것을 마샬링하기위한 표준 방법이 필요하다는 것을 의미합니다 (예 : 범용 풀에 던져 넣음).
단일 스레드 이벤트의 목적 상 별도의 단일 스레드 실행 프로그램이 있습니다. 그것은 하나의 스레드를 더 사용할 수도 있음을 의미하지만 그 영향은 그다지 크지 않다고 생각합니다. –
가능한 복제본 : http://stackoverflow.com/questions/2153663/controlling-task-execution-order-with-executorservice – finnw
@finnw, 요점이 있습니다. 동일하지 않은지 확실히 모르겠다. (다중 쓰레드 일 수있는 하나의 ExecutorService를 사용하도록 제한하려고한다.) –