Добавление задач в пул потоков

27.07.2016

Существует несколько способов добавления задач в пул потоков. Их можно добавлять по отдельности или целыми пакетами. Когда имеется несколько задач, допускающих параллельное выполнение, их можно добавлять последовательно, одну за другой с помощью метода execute или submit. Но платформа предоставляет более удобные методы для добавления пакетов задач: invokeAll () и invokeAny ().

При вызове этого метода коллекция задач упорядоченно добавляется в пул потоков. В зависимости от конфигурации и состояния пула результатом добавления каждой задачи может стать создание потока, размещение задачи в очереди или отказ от выполнения задачи, как при использовании submit!) и execute!). Значение тайм-аута может быть определено для тех случаев, когда invokeAll () необходимо иметь возможность прервать ожидание завершения фоновых задач. По истечении тайм-аута незавершённые задачи отменяются. Не знаете куда деть ненужный металлолм? Оставьте заявку и мобильный пункт вывезет ваш лом по отличной цене.

После завершения всех задач их результаты сохраняются в списке объектов Future в том же порядке, в котором добавлялись задачи, то есть в возвращаемом списке результат находится в той же позиции, в которой соответствующая задача располагалась во входной коллекции. После завершения задачи вызов Future. isDone () возвращает значение true, а вызов Future .get () возвращает результат выполнения данной задачи без блокировки. В примере invokeAll () используется для параллельного выполнения двух независимых задач и объединения их результатов после завершения. Обычно такая схема работы применяется для извлечения сетевых данных из двух разных мест, когда полученные данные перед их использованием должны быть объединены каким-либо образом. Извлечение данных инициируется щелчком на кнопке в компоненте Activity, то есть в Ш-потоке, но поскольку вызов invokeAll!) является блокирующим, он выполняется из объекта SimpleExecutor.