Вот небольшой пример, который может оказаться полезным для начала работы с распараллеливанием. Предполагается, что:
- Вы создаете
Input
объект, который содержит входные данные для каждой итерации вашего вычисления.
- Вы создаете объект
Output
, который содержит выходные данные вычисления входных данных каждой итерации.
- Вы хотите передать список входов и сразу получить список выходов.
- Ваш вклад - разумный кусок работы, поэтому накладные расходы не слишком велики.
Если ваши вычисления действительно просты, вы, вероятно, захотите рассмотреть их обработку в пакетном режиме. Вы можете сделать это, поставив скажем 100 в каждом входе. Он использует столько потоков, сколько имеется процессоров в вашей системе. Если вы имеете дело с задачами с исключительно интенсивным использованием процессора, то это, вероятно, тот номер, который вам нужен. Вы бы захотели подняться выше, если они заблокированы, ожидая чего-то другого (диск, сеть, база данных и т.
public List<Output> processInputs(List<Input> inputs)
throws InterruptedException, ExecutionException {
int threads = Runtime.getRuntime().availableProcessors();
ExecutorService service = Executors.newFixedThreadPool(threads);
List<Future<Output>> futures = new ArrayList<Future<Output>>();
for (final Input input : inputs) {
Callable<Output> callable = new Callable<Output>() {
public Output call() throws Exception {
Output output = new Output();
// process your input here and compute the output
return output;
}
};
futures.add(service.submit(callable));
}
service.shutdown();
List<Output> outputs = new ArrayList<Output>();
for (Future<Output> future : futures) {
outputs.add(future.get());
}
return outputs;
}