Точки приостановки могут использоваться только в контексте сопрограммы, например:
fun main() {
delay(1000)
}
Не будет работать, потому что delay
является функцией приостановки, и компилятор не будет знать, как справиться с этим безсопрограмма.Когда у вас есть сопрограмма, она может использовать то, что называется диспетчером, для управления владением потоком.Приостановка означает, что поток больше не используется для выполнения этой части вашей программы, а выполняет что-то еще или работает без дела.Это работает так, что вы можете иметь несколько сопрограмм, работающих одновременно, не имея потока для каждого, этот поток затем может выполнять части каждой сопрограммы вплоть до точки приостановки.Обычно идея заключается в том, что вы можете рассматривать приостановленные функции как «генераторы», у которых есть этапы для получения результата.
suspend fun hello() {
println("Hello")
delay(1000) // suspend here, let someone else use the thread while we wait
println("World")
delay(1000) // suspend again, we can still use the thread while waiting
println("done")
}
Каждый раз, когда это приостанавливается, он использует поток для работы с другой функцией до тех пор, пока это не приостановится и не произойдет задержка.истекает, в этот момент эта функция в конечном итоге возобновит выполнение до следующей точки приостановки или полностью завершит выполнение.
Это отличается от блокировки кода, так как не тратит поток, помещая егов wait состояние, а скорее заимствует его для другой функции.Таким образом, не нужно создавать другие потоки, чтобы иметь параллелизм, поскольку вы все равно можете работать с несколькими функциями без истинного параллелизма, вместо этого он использует параллельное выполнение частей функций.
Сопрограммы не обязательно защищают вас от блокировки, если вы позвоните Thread.sleep(1000)
, это все равно будет блокирующий вызов.Программист несет ответственность за использование суспендирующих эквивалентов для блокировки функций, чтобы максимизировать эффективность этой концепции.
Для получения более подробной информации, пожалуйста, прочитайте документацию , поскольку она очень подробная и полезная.