В Kotlin общий подход - сопрограммы, но нормальная многопоточность также является вполне подходящим вариантом, в зависимости от того, что вы делаете.
Например, если ваша операция является операцией блокировки потока фактически он не может безопасно работать в сопрограмме, если он не отправлен в отдельный поток. Для сопрограмм вам нужно знать разницу между приостановкой и блокировкой (огромная разница).
Так что, если чтение таблицы HTML является операцией блокировки, и вам не нужно интегрироваться с другими сопрограммами, тогда нормальный поток работает просто отлично. Существует множество Java примеров, которые можно перенести в Kotlin.
С сопрограммами вы можете сделать что-то вроде:
suspend fun getDoc() = withContext(Dispatchers.IO) {
Jsoup.connect(url).timeout(0).maxBodySize(0).ignoreHttpErrors(true).sslSocketFactory(setTrustAllCerts()).get()
}
Затем в своем основном коде:
fun main() = runBlocking {
val deferredDoc = async { getDoc() }
// Do whatever.... it's not being blocked...
val doc = deferredDoc.await() // SUSPENDING CALL - but not blocking
}
Очевидно, что структура вашей программы будет выглядеть иначе, чем в этом примере, потому что она полностью зависит от того, какой код вы хотите выполнить асинхронно с помощью getDo c ().
Например, вы можете даже есть другая сопрограмма, которая выполняется, пока "deferredDo c .await ()" приостанавливается, даже не создавая другой поток. Это преимущество сопрограмм.
В приведенной выше структуре у нас есть 3 гарантированных потока:
- Основная нить, которая всегда блокируется
- Основная нить сопрограммы. Это то, на чем обычно работают сопрограммы. Kotlin сопрограммы будут запускать ваши сопрограммы асинхронно внутри этого потока, используя приостановку.
- поток ввода-вывода. Это то, на чем будет работать ваш код .