Эта проблема состоит из 2 частей:
- Обеспечение отмены задач.
- Отмена братьев и сестер при сбое одной задачи.
Выполнение отмены задачи
Monix имеет BooleanCancelable , что позволит вам установить результат isCancelled
в true
при вызове cancel
.
cancel
также необходимопозвонить Thread.interrupt
, чтобы разбудить его, когда Thread.sleep
работает. В противном случае sleep
пробежит свой курс. Однако это вызовет InterruptedException в вашей задаче. Это должно быть обработано.
Отмена родных братьев
Существует CompositeCancelable . Это похоже на сценарий использования CompositeCancellable
для вызова cancel
из родительской задачи. Таким образом, после создания CompositeCancellable
(т. Е. Все задачи создаются):
- Любая ссылка на это должна быть доступна для каждой задачи, чтобы сбойная задача могла вызвать для нее
cancel
,(Обратите внимание, что это своего рода циклическая ссылка, лучше ее избегать) - Или родительская задача (или код) получает уведомление о сбое подзадачи и вызывает
cancel
. (Это позволит избежать циклической ссылки)
Еще один способ уведомить родственные задачи состоит в том, чтобы использовать AtomicBoolean и часто проверять его (спящий режим 10 миллисекунд вместо 1000). При сбое одной задачи она устанавливает логическое значение, чтобы другие задачи могли остановить их выполнение. Это, конечно, не включает Cancellable
. (И это своего рода хак, лучше использовать monix планировщик)
Примечание
Это хорошая идея для вызова Thread.sleep
в Task
? Я думаю, что это помешало бы другой задаче использовать этот поток. Я думаю, что использование планировщика для добавления задержек и составление этих подзадач является способом наиболее эффективного использования пула потоков.