1. 简介
协程是Java线程的替代品,因为它们提供了一种在非常高的并发水平上执行可中断任务的方法,但是在Project Loom完成之前,我们必须依靠库支持来获得它。
在本教程中,我们将了解Quasar,一个提供协程支持的库。
2. 设置
我们将使用最新版本的Quasar,该版本需要Java 11或更高版本。但是,示例应用程序也可以与Java 7和8兼容的早期版本的Quasar一起使用。
Quasar提供了三个依赖,我们需要将其包含在构建中:
<dependency>
<groupId>co.paralleluniverse</groupId>
<artifactId>quasar-core</artifactId>
<version>0.8.0</version>
</dependency>
<dependency>
<groupId>co.paralleluniverse</groupId>
<artifactId>quasar-actors</artifactId>
<version>0.8.0</version>
</dependency>
<dependency>
<groupId>co.paralleluniverse</groupId>
<artifactId>quasar-reactive-streams</artifactId>
<version>0.8.0</version>
</dependency>
Quasar的实现依赖于字节码检测才能正常工作,要执行字节码检测,我们有两个选择:
- 在编译时,或
- 在运行时使用Java代理
使用Java代理是首选方式,因为它没有任何特殊的构建要求并且可以适用于任何设置。
2.1 使用Maven指定Java代理
要使用Maven运行Java代理,我们需要包含maven-dependency-plugin以始终运行properties目标:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>getClasspathFilenames</id>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
properties目标将生成一个指向类路径上的quasar-core.jar位置的属性。
为了执行我们的应用程序,我们将使用exec-maven-plugin:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<workingDirectory>target/classes</workingDirectory>
<executable>echo</executable>
<arguments>
<argument>-javaagent:${co.paralleluniverse:quasar-core:jar}</argument>
<argument>-classpath</argument> <classpath/>
<argument>cn.tuyucheng.taketoday.quasar.QuasarHelloWorldKt</argument>
</arguments>
</configuration>
</plugin>
为了使用该插件并启动我们的应用程序,我们将运行Maven:
mvn compile dependency:properties exec:exec
3. 实现协程
为了实现协程,我们将使用Quasar库中的Fibers。Fibers提供轻量级线程,这些线程将由JVM而不是操作系统管理。由于它们需要的RAM很少,并且对CPU的负担也小得多,因此我们可以在应用程序中拥有数百万个Fibers,而不必担心性能。
为了启动纤程,我们创建Fiber<T>类的实例,它将包装我们要执行的代码并调用start方法:
new Fiber<Void>(() -> {
System.out.println("Inside fiber coroutine...");
}).start();
4. 总结
在本文中,我们介绍了如何使用Quasar库实现协程。我们在这里看到的只是一个最小的工作示例,Quasar库可以做更多的事情。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章
