Асинхронный шаблон задачи в Java

Я перехожу от С# к Java, и мне нужно реализовать набор асинхронных задач.

Я хорошо разбираюсь в потоке Java, но мне нравились методы .NET BeginInvoke и EndInvoke, потому что они позволяли мне легко переключаться с синхронных на асинхронные задачи.

В моем случае, если у меня есть набор интенсивных операций ввода-вывода (подходит для перехода на асинхронный режим), например:

DoOperation1();
DoOperation2();
DoOperation3();

в .NET Я бы легко сделал что-то вроде:

BeginInvoke(DoOperation1);
BeginInvoke(DoOperation2);
BeginInvoke(DoOperation3);
EndInvoke(Result1);
EndInvoke(Result2);
EndInvoke(Result3);

Вкратце, мой вопрос: есть ли что-то подобное в Java, или мне нужно использовать потоки вручную "старый способ"?

Спасибо.

Ответ 1

Вероятно, вы хотите использовать фьючерсы на Java. Вы отправляете задание в ExecutorService и получаете Future<T> назад, который вы можете задать в аналогично Task<T> из .NET 4 TPL... вы можете спросить будущее о его результате блокирующим способом или тайм-аутом, спросить, было ли это сделано и т.д.

Работа с Callable<T> не такая аккуратная, как использование делегатов в С# с помощью преобразований групп методов и лямбда-выражений, но основные идеи схожи.

Ответ 2

Я думаю, вы, вероятно, захотите использовать ExecutorService вместе с классами Runnable или Callable, которые завершают реализацию заданий, которые вы пытаетесь запустить.

Пример:

SomeTask someTask1 = ...
SomeTask someTask2 = ...

executorService.execute(someTask1);
executorService.execute(someTask2);

executorService.shutdown(); //Close down the service