Почему можно сделать 1000 корутин, а 1000 потоков сделать нельзя

Ответ

Корутины легковесны и работают поверх одного потока, используя механизм 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, потому что памяти на все эти потоки просто не хватит. Вот и вся разница, ёпта. Одно — хитрая, умная абстракция, а другое — тупое и прожорливое железо. Выбирай, что тебе ближе, но если не хочешь проблем — доверия ебать ноль к потокам, когда задач много.