Java Callable. Краткое описание и пример использования

Java Callable. Краткое описание и пример использования

Последние несколько постов мы разбирались с потоками в Java. Сегодня мы продолжим тему многопоточности в Java и поговорим о Java Callable: разберем теорию и посмотрим пример использования. 

Очень часто при работе с потоками нам нужно получать какой-то результат и было бы очень удобно, чтобы поток сам возвращал результаты своей работы. Именно поэтому еще в Java 5 был введен интерфейс  java.util.concurrent.Callable. Он очень похож на интерфейс Runnable, но может вернуть результат в виде объекта Object и способен бросать исключения.

Интерфейс Callable использует дженерики для определения типа возвращаемого объекта. Класс Executors предоставляет полезные методы для выполнения Callable в пуле потоков. Callable таски (задачи) возвращают java.util.concurrent.Future объект. Используя Future мы можем узнать статус Callable таска и получить возвращенный объект. Это обеспечивает get() метод, который ждет завершение Callable, чтобы вернуть результат.

Future обеспечивает метод cancel() для отмены Callable таска. Есть перегруженный вариант метода get(), где мы можем указать время ожидания результата, это нужно для избежания блокировки текущего потока на длительное время. Также есть методы isDone() и isCancelled(), которые используются для получения статуса ассоциированного Callable таска.

Вот простой пример использования Callable таска, который возвращает имя потока. В примере используется Executor framework для одновременного выполнения 100 задач и Future, чтобы получить результат выполнения:

Результат выполнения программы (часть вывода):

В следующих статьях мы разберем Java FutureTask и ScheduledThreadPoolExecutor. Следите за обновлениями.

3 thoughts to “Java Callable. Краткое описание и пример использования”

  1. Отличный подробный простой прозрачный пример. Спасибо большое, пойду сделаю себе чашечку такого же. 🙂

  2. Почему цикл рассчитан на 100 итераций, а в list добавляется только 10 future’ов? Я так понимаю, что ответ будет: «потому что executor рассчитан на 10 нитей». Но тогда опять возвращаюсь к вопросу о необходимости цикла на 100 итераций.. Спасибо!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *