Асинхронный шаблон задачи в 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