Ответ
Job и Deferred — оба представляют корутины, но с разными целями:
- Job — это фоновый процесс без возвращаемого значения. Управляется методами
start(),cancel(),join().
val job = launch { /* работа без результата */ }
job.cancel()
- Deferred — это
Jobс результатом (наследует отJob). Возвращает значение черезawait().
val deferred = async { 42 }
val result = deferred.await() // 42
Ключевое отличие: Deferred используется для асинхронных вычислений с возвратом данных, а Job — для фоновых задач без результата.
Ответ 18+ 🔞
А, ну это же классика, ёпта! Смотри, чтобы не путаться, как последний распиздяй. Есть два типа корутин — одни просто делают что-то в фоне, а другие ещё и результат приносят.
Job — это как твой друг, который пошёл в магазин за пивом. Ты его запустил (start()), можешь позвонить и сказать «отмена, я уже нажрался» (cancel()), или ждать у подъезда, пока вернётся (join()). Но пива-то он тебе ещё не принёс! Он просто процесс. Задача без конкретного результата, которую можно стартануть и отменить.
val job = launch { /* тупо работа без результата */ }
job.cancel() // Всё, не надо.
А Deferred — это тот же самый друг, но ты ему дал денег и чёткий список. Он тоже Job (то есть его можно отменить или подождать), но он ещё и наследник, умнее. Он обязан вернуть тебе результат. Грубо говоря, это Job с довеском в виде ответа. Ждёшь ты его через await(), и он тебе выдает, что приобрёл.
val deferred = async { 42 } // Сходил, купил, посчитал.
val result = deferred.await() // Держи, вот твоё число 42.
Короче, суть в чём: Deferred — для асинхронных вычислений, от которых ты ждёшь ответ (число, список, строку). А обычный Job — для фоновой работы, где важен сам факт выполнения, а не итог. Всё просто, как три копейки. Не путай, а то будет тебе хиросима в коде.