在 JVM 中,java 线程直接映射内核线程,因此 java 线程的创建、销毁和调度都要依赖内核态的操作(系统调用)。而协程是真正的用户线程,如上图所示很多的协程可以映射很少的几个内核线程,并且协程的创建、销毁和调度完全在用户态实现,不需要切换到特权模式因此相比于线程更加的轻量。在调度方面,协程没有时间片的概念,一个协程会在线程上一直运行直到运行结束或执行阻塞操作,在阻塞结束后,协程又可以被调度到某线程上运行。协程非常适合于高并发和 IO 密集型操作,我们知道对于单核 CPU 来说,执行 IO 密集型任务时多线程可以提高效率,虽然此时多线程会带来额外的线程上下文切换开销,但它能更好地协调 CPU 和 IO 的占用,而显然协程能更轻量更高并发地完成这件事。当协程遇到阻塞操作时,它是阻塞在 JVM 用户态的,并且它所在的线程并不会阻塞,而是会调度运行其他协程。