Ответ
Корутины легковесны и работают поверх одного потока, используя механизм suspension/resume. Они не создают нативные потоки ОС, а выполняются в рамках пула потоков (Dispatchers). Каждая корутина занимает ~1KB памяти.
Потоки же — нативные объекты ОС, каждый требует ~1MB стека и создание/переключение между ними дорого. ОС ограничивает их количество (обычно ~1k-10k).
// 1000 корутин — легко
repeat(1000) {
launch(Dispatchers.IO) { /* work */ }
}
// 1000 потоков — упадёт с OOM
repeat(1000) {
Thread { /* work */ }.start()
} Ответ 18+ 🔞
Ну ты представляешь, вот сидишь такой, думаешь: "Э, бошка думай, как бы мне тысячу задач параллельно запустить?" И тут тебе на выбор — либо корутины, либо потоки. И разница между ними, бля, просто овердохуища!
Смотри, корутины — это такие легковесные штуки, которые работают в рамках одного потока, но умеют приостанавливаться и возобновляться. Они не создают нативных потоков операционки, а юзают уже готовый пул (эти твои Dispatchers). Каждая такая мартышлюшка памяти жрёт всего ничего, килобайт где-то. Представляешь? Одна корутина — одна пачка чипсов по весу в оперативке.
А потоки — это уже серьёзные дядьки, нативные объекты самой операционки. Каждый такой хуй с горы требует под себя мегабайт стека, не меньше. Создать его — дорого, переключиться между ними — тоже не сахар. И система их, сука, жёстко лимитирует: ну, там тысяча, может, десять тысяч — и всё, приехали, накрылся медным тазом.
Вот смотри на код, тут всё наглядно:
// 1000 корутин — легко, как два пальца обоссать
repeat(1000) {
launch(Dispatchers.IO) { /* work */ }
}
// 1000 потоков — упадёт с OOM, и будет тебе хиросима и нигерсраки
repeat(1000) {
Thread { /* work */ }.start()
}
Видишь? Тысячу корутин запустил — и даже не чихнул. А попробуй тысячу потоков стартануть — приложение тут же взвоет, как сука, и рухнет с OutOfMemoryError, потому что памяти на все эти потоки просто не хватит. Вот и вся разница, ёпта. Одно — хитрая, умная абстракция, а другое — тупое и прожорливое железо. Выбирай, что тебе ближе, но если не хочешь проблем — доверия ебать ноль к потокам, когда задач много.