TL;DR
内部でスリープするようなFutureのインスタンスを、
Java 21のVirtual ThreadおよびPlatfrom Threadから作成し、
処理にかかった時間を出してみました。
Platfrom Thread
まずはscala.concurrent.ExecutionContext.Implicits.global
を使って、
1秒スリープするFutureのインスタンスを50個作ってみました。
結果はコメントに記載の通り7726msかかりました。
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
object Main extends App {
val start = System.currentTimeMillis()
val futures = (1 to 50).map { _ =>
Future{
Thread.sleep(1000)
}
}
Await.ready(Future.sequence(futures), Duration.Inf)
val end = System.currentTimeMillis()
println(s"${end - start}ms") // 7726ms
}
Virtual Thread
同じ条件でVirtual Threadを使って、
スリープするFutureのインスタンスを50個作った結果、1141msかかりました。
少々荒っぽい試し方ですが、スレッドがスリープ処理によって占有されていないことが示唆されますね。
import java.util.concurrent.Executors
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, ExecutionContext, Future}
object VirtualThreadTest extends App {
implicit val ec: ExecutionContext = ExecutionContext.fromExecutor(Executors.newVirtualThreadPerTaskExecutor())
val start = System.currentTimeMillis()
val futures = (1 to 50).map { _ =>
Future{
Thread.sleep(1000)
}
}
Await.ready(Future.sequence(futures), Duration.Inf)
val end = System.currentTimeMillis()
println(s"${end - start}ms") // 1141ms
}