Future. Я хочу его кучу раз вызвать и подождать завершения всех их. А если вылетит исключение в какой-то из разов, то быстро его поймать, все остановить и пойти дальше. Ничего умнее чем собрать все в список и сделать futures.forEach { it.get() } нет?
Есть, get использовать не нужно
Не понял, а что тут может быть умнее
Если у тебя только Future, то облом — ни как. Future это не асинхронный примитив. Он для thread-based programming. Там есть только блокирующий get. То есть на каждый future, чтобы его ждать, тебе нужен отдельный поток.
Вот как-то так нужно писать: fun main(args: Array<String>) { val futures = listOf<Future<String>>() GlobalScope.launch { var isDone = false var isDoneExceptionally = false while (isActive && !isDone) { futures.forEach { if (it.isDone) { try { it.get() } catch (e: Exception) { // LOGGER.error(e) isDoneExceptionally = true } } if (it.isCancelled) { isDoneExceptionally = true } } if (futures.all { it.isDone }) isDone = true delay(100) } } }
В общем-то вот полностью рабочий код: https://gist.github.com/IRus/831d5da4234a7ff13cc6dbbccc56064e Осталось понять только как там cancel работает, но он будет падать asap
Обсуждают сегодня