У меня есть итератор с общим назначением: что-то вроде этого:
class Mapper<F, T> implements Iterator<T> {
private Iterator<F> input;
private Action<F, T> action;
public Mapper(input, action) {...}
public boolean hasNext() {
return input.hasNext();
}
public T next() {
return action.process(input.next());
}
}
Теперь, учитывая, что action.process() может занять много времени, я хочу повысить производительность, используя несколько потоков для обработки элементов из входа параллельно. Я хочу выделить пул из N рабочих потоков и выделить элементы для этих потоков для обработки. Это должно происходить "за кулисами", поэтому клиентский код просто видит итератор. Код должен избегать использования входной или выходной последовательности в памяти.
Чтобы добавить завихрение, мне нужны две версии решения, одна из которых сохраняет порядок (последний итератор доставляет элементы в том же порядке, что и итератор ввода), и один из них не обязательно сохраняет порядок (каждый выходной элемент доставлен как только он будет доступен).
У меня есть такая работа, но код кажется запутанным и ненадежным, и я не уверен, что он использует лучшие практики.
Любые предложения по простейшему и наиболее надежному способу реализации этого? Я ищу что-то, что работает в JDK 6, и я хочу, если возможно, избегать введения зависимостей от внешних библиотек/фреймворков.