大雑把にI/O観点で二つに分けると
昔は同期I/Oでブロックされるからマルチスレッド
今は非同期プログラミングでスレッド数はシングルからCPUコア数が上限
RustのFutureタスク、GoのGoルーチン、JavaScriptの非同期Promiseやコールバック
いずれもプロセス内スケジューラがI/O多重化(select/epoll)やタイマーなど管理して非同期プログラミングを支えている