試用了一下 http://docs.paralleluniverse.co/quasar/,發現它是基於JDK 1.7的(主要是fork join pool)。於是拿kilim的程式碼改了一個純協程的版本出來。kilim的原始版本(https://github.com/kilim/kilim)裡所有的Task都與一個Scheduler繫結,而且官方的例子裡都是講怎麼使用Mailbox做messaging的。這個路數和stackless python非常像。兩個都是以提供scheduler和messaging為主要api,把協程的api隱藏在下面。為了搞一個更簡單的,純協程api來玩,把kilim裡無關的程式碼都給刪了。結果在這裡:https://github.com/taowen/kilim
和官方的版本的不同在於,Task新增了一個方法resume(相當於greenlet的switch)。第一次執行resume的時候就是開始執行這個task。如果task yield了,就會中途退出。要在斷點繼續的話,再次呼叫resume。
package hello_world;
import kilim.Pausable;
import kilim.Task;
public class Main {
public static void main(String[] args) {
Task task = new Task() {
@Override
public void execute() throws Pausable {
System.out.println("hello");
yield();
System.out.println("world");
}
};
task.resume();
System.out.println("hey there");
task.resume();
}
}
程式碼輸出如下
hello
hey there
world
要想執行的話。要預先進行weave。其實就是一條命令java kilim.tools.Weaver -d classesDir classesDir。但是要把這條命令整合到gradle的build過程中,還是很不容易的
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'hello_world.Main'
repositories {
mavenCentral()
mavenLocal()
}
configurations {
kilim
}
dependencies {
compile 'org.slf4j:slf4j-api:1.7.5'
compile 'org.github.taowen:kilim:1.0'
kilim 'org.github.taowen:kilim:1.0'
testCompile "junit:junit:4.11"
}
task weave(type: JavaExec) {
classpath "$project.buildDir/classes/main"
classpath configurations.kilim
main = "kilim.tools.Weaver"
args "-d", "$project.buildDir/classes/main", "$project.buildDir/classes/main"
}
classes.dependsOn(weave)
關鍵點在於classes.dependsOn(weave),這樣可以讓weave在javaCompile之後,classes之前執行。這種修改別的task的dependency的做法比ANT靈活多了。