简谈coroutine
上次谈到了concurrent(http://bookjovi.iteye.com/blog/1333431),里面说到了Erlang和Go语言,今天再谈谈coroutine,在Erlang中process不能称为coroutine,同样Go中也避免了coroutine的用词,而直接改为goroutine,那么coroutine是什么呢?
?
关于coroutine在wikipedia中有着非常详尽的描述:http://en.wikipedia.org/wiki/Coroutine
coroutine和Erlang process/goroutine的最大区别是coroutine只能在一个线程中执行,所以不能算的上是真正的concurrent,coroutine中比较普遍的关键词是yield,在coroutine中只能主动放弃执行权,而不能被动抢占。
实现coroutine的语言有:lua, Perl 6(built-in), tcl(built-in)等。
?
Java中有coroutine吗?答案是在语言层次上是没有,不过可以通过其他方式,如修改JVM(http://openjdk.java.net/projects/mlvm/),期望jdk 8能加上这方面的特性(期望java concurrent特性的可以看看scala语言)。bluedavy有一遍关于java的coroutine文章,写的很好?http://blog.bluedavy.com/?p=4
?
其实有时coroutine用几行C代码就可以模拟了,看看“Coroutine in C”:
http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
public class Continuation { public Continuation (); public void Mark (); public int Store (int state); public void Restore (int state); } var c = new Continuation (); ... switch (c.Store (0)){ case 0: // First invocation case 1: // Restored from the point ahead. } ... // Jump back to the switch statement. c.Restore (1);这个例子和上面那个coroutine in C 是不是很像啊?可以深层次的把continuation理解为C里面的setjmp和longjmp。
?
?
写的很乱!:)
?