Шаблон асинхронной задачи в Java - PullRequest
10 голосов
/ 28 февраля 2011

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

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

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

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

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

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

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

Спасибо.

Ответы [ 2 ]

12 голосов
/ 28 февраля 2011

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

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

4 голосов
/ 28 февраля 2011

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

Пример:

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

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

executorService.shutdown(); //Close down the service
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...