协程和线程有什么区别?Java 的虚拟线程是怎样实现的?
先自己想一想,再看参考要点
参考要点
- 协程在用户态由运行时调度,Go 和 Java 虚拟线程把大量协程映射到少量线程上(M:N),Python asyncio 则在一个线程的事件循环中执行,切换不陷入内核、内存占用小,可以大量创建,但同一线程上的协程不能并行
- 虚拟线程是 JVM 实现的有栈协程,由 ForkJoinPool 的平台线程(默认等于 CPU 核数)执行,阻塞 I/O 时卸载,栈帧以栈块对象存入堆,就绪后再挂载到某个平台线程继续执行
- JDK 21 中在 synchronized 内阻塞无法卸载,JDK 24 起基本消除