当前位置: 首页 > 工具软件 > Kilim > 使用案例 >

kilim Hello world

糜征
2023-12-01

本文主要介绍kilim的相关资源以及以Hello world为例,介绍kilim如何编译运行。

下载源码

kilim 1.0:https://github.com/kilim/kilim
kilim 2.0:https://github.com/nqzero/kilim
工程里包含了基础的运行方式、源码、例子以及相关文档等资源。如果在使用中遇到什么问题或者bug,都可以给作者提issue,让kilim变得更好,我们团队在使用过程中就遇到了很多诡异的问题:https://github.com/kilim/kilim/issues

kilim编译

kilim框架可以使用maven来编译,引入了ant编译插件,ant的配置中指明了需要weave(织入)的目录,使用maven package就可以编译出一个kilim的jar包出来。

mvn package

可以在这个kilim的工程里加入自己的测试例子,框架里也有对应的一些例子,在kilim.examples包下。

运行

hello,world 源码路径:

https://github.com/kilim/kilim/blob/master/examples/kilim/examples/SimpleTask.java
/**
 * Spawn a task, communicate through a shared mailbox. The task's
 * termination is knowm through another mailbox.
 * 
 * The structure of this class is not much different from a Thread 
 * version that uses PipedInput/OutputStreams (Task instead of Thread,
 * execute() instead of run(), and typed, buffered mailboxes instead
 * of pipes.
 * 
 * [compile] javac -d ./classes SimpleTask.java
 * [weave]   java kilim.tools.Weave -d ./classes kilim.examples.SimpleTask
 * [run]     java -cp ./classes:./classes:$CLASSPATH  kilim.examples.SimpleTask
 */
public class SimpleTask extends Task {
    static Mailbox<String> mb = new Mailbox<String>();

    public static void main(String[] args) throws Exception {
        new SimpleTask().start();
        Thread.sleep(10);
        mb.putnb("Hello ");
        mb.putnb("World\n");
        mb.putnb("done");
    }

    /**
     * The entry point. mb.get() is a blocking call that yields
     * the thread ("pausable")
     */

    public void execute() throws Pausable{
        while (true) {
            String s = mb.get();
            if (s.equals("done")) break;
            System.out.print(s);
        }

        // This is not good form. Tasks shouldn't be exiting the system. 
        // See SimpleTask2 for a better way to clean up.
        System.exit(0);
    }
}

直接用上面的编译方式即可运行,也可以使用命令行的方式来运行。

➜  kilim git:(master) ✗ java -cp ./classes:$CLASSPATH kilim.examples.SimpleTask
Hello World

可能会报错:

Exception in thread "main" java.lang.UnsupportedClassVersionError: kilim/examples/Chain : Unsupported major.minor version 52.0

这是eclipse中编译的java jdk版本,和命令行的版本不一致导致;
eclipse中使用的是1.8,切换为1.7,和命令行的保持一致即可。

如果你尝试使用命令行手动编译,可能会遇到一些,可以参考:
http://phl.iteye.com/blog/2247112
http://blog.csdn.net/chenyi8888/article/details/7047099

windows命令行可以这样编译运行:

编译
java -cp kilim.jar: kilim.tools.Weaver -d ./classes kilim.examples.SimpleTask
织入
java -cp kilim.jar:libs/asm-all-4.1.jar kilim.tools.Weaver -d ./classes kilim.examples.SimpleTask
执行
java -cp kilim.jar:classes kilim.examples.SimpleTask

E:\code\git\kilim>java -cp kilim.jar;classes;libs\asm-all-4.1.jar;$CLASSPATH kilim.examples.SimpleTask
Hello World

大概分析:

  • 协程和线程的使用方式很像,task替代Thread,execute()代替run()方法,使用mailbox对象进行通信。
  • 可以看到编写协程代码,思路非常的清晰,继承一个Task,一个Task就是一个角色,用来完成一件事情或者多件事情。task可以阻塞(比如mailbox.get()), 然后交给调度器去调度,当监听到 可以继续执行下去的时候,调度器继续执行下去,并保存了相应的上下文。这样并不阻塞其它的线程以及其它的协程任务,只会阻塞当前的协程,当然你也可以调用不阻塞当前协程的api(mailbox.getn()). 这都取决于你的业务场景。

外部工程引入kilim

  • kilim 1.0属于较早的工程,对于使用感觉做的不太够,只是声明了需要使用weaver去织入代码。我们团队的框架也是用这种思路去编译cgi和后台server工程。
  • kilim2.0中给出了一个kilim的编译插件
<plugin>
        <groupId>org.db4j</groupId>
        <artifactId>kilim</artifactId>
        <version>2.0.0-14</version>
        <executions>
            <execution>
                <goals><goal>weave</goal></goals>
            </execution>
        </executions>
    </plugin>

我这里使用java8可以完美使用,但是java7会报错,理论上本地用java7编译一下kilim2.0,应该就可以用这个插件了。 这个插件应该是来源于:https://github.com/jestan/kilim-maven-plugin, 如果你使用的是kilim1.0版本,你把相应的代码迁移到你的1.0版本,应该也可以完美使用。
* 还有另外一种方式,应该也是比较好的:

https://github.com/pfmiles/kilim-fiber/wiki
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                <classpathScope>compile</classpathScope>
                    <executable>java</executable>
                    <arguments>
                        <argument>-classpath</argument>
                        <classpath />
                        <argument>kilim.tools.Weaver</argument>
                        <argument>-d</argument>
                        <argument>${project.build.outputDirectory}</argument>
                        <argument>${project.build.outputDirectory}</argument>
                    </arguments>
                </configuration>
            </plugin>

具体可以见我的一个工程demo:https://github.com/zy416548283/JavaBaseStudy/

 类似资料:

相关阅读

相关文章

相关问答