【JAVA新生】kilim版的協程

taowen發表於2014-09-27

試用了一下 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靈活多了。

相關文章