读书笔记之在Java中使用协程

来源:互联网 发布:免费cad软件 编辑:程序博客网 时间:2024/04/30 15:11

理论上协程能够大幅度提升java应用所能支撑的并发量,目前java应该在JDK7里增加这样的一个特性。

背景知识

现在的操作系统都是支持多任务的,多任务可通过多进程或多线程的方式去实现。

多任务的调度上操作系统采用抢占式和协作式两种方式:

抢占式是指操作系统给每个任务一定的执行时间片,在这个时间片到达后如任务仍然未释放对CPU的占用,那么操作系统将强制释放,这是目前多数操作系统采取的方式;

协作式是指操作系统按照任务的顺序来分配CPU,每个任务执行过程中除非其主动释放,否则将一直占据CPU;

这种方式值得注意的是一旦有任务占据CPU不放,会导致其他任务“饿死”的现象,因此操作系统确实不太适合采用这种方式。


说完操作系统多任务调度方式后,来看看通常程序是如何实现支持高并发的,一种就是典型的给予操作系统提供的多进程或多线程机制,每个任务占据一个进程或一个线程,当任务中有IO等待等动作时,则将进程或线程放入待调度队列中,这种方式是目前大多数程序采取的方式,这种方式的坏处在于如果想支持高的并发量,就不得不创建很多的进程或线程,而进程和线程都是要消耗不少系统资源的。另一方面,进程或线程创建太多后,操作系统需要花费很多的时间在进程或线程的切换上,切换动作需要做状态保持和恢复,这也会消耗掉很多的系统资源;

另外一种方式则是每个任务不完全占据一个进程或线程,当任务执行过程中需要进行IO等待等动作时,任务则将其所占据的进程或线程释放,以便其他任务使用这个进程或线程。这种方式的好处可以减少所需要的原生的进程或线程树,并且由于操作系统不需要做进程或线程的切换,而是自行来实现任务的切换,其成本会较操作系统切换低。而这种方式也就是Coroutine方式,又称为协程方式。

这种方式我在erlang里也见过,当时对这个概念的理解也是居于编写程序的方式,

如果在JDK7里有这样的新特性,那么将会是一个很好的特性,将大大提升java的性能。

而且采用此方式,将很好的绕开需要启动太多线程来支撑高并发出现的瓶颈,提升java应用所能支撑的并发量。

网上介绍了有Scala、Kilim两种方式,根据目前网上的测试情况来看,后者表现更好一点。