1. Введение
Сопрограммы являются альтернативой потокам Java, поскольку они обеспечивают способ выполнения прерываемых задач на очень высоком уровне параллелизма , но пока Project Loom не будет завершен, нам придется обратиться к поддержке библиотеки, чтобы получить ее.
В этом уроке мы рассмотрим Quasar, одну из таких библиотек, которая предлагает поддержку совместных программ.
2. Настройка
Мы будем использовать последнюю версию Quasar, для которой требуется Java 11 или выше. Но пример приложения также будет работать с предыдущими версиями Quasar, совместимыми с Java 7 и 8.
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. Укажите агент Java с помощью Maven
Чтобы запустить агент Java с Maven, нам нужно включить плагин maven-dependency-plugin
, чтобы всегда запускать цель свойств :
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>getClasspathFilenames</id>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
Цель свойств
создаст свойство, указывающее на местоположение quasar-core.jar
в пути к классам. ``
Для выполнения нашего приложения мы будем использовать exec-maven-plugin
:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<workingDirectory>target/classes</workingDirectory>
<executable>echo</executable>
<arguments>
<argument>-javaagent:${co.paralleluniverse:quasar-core:jar}</argument>
<argument>-classpath</argument> <classpath/>
<argument>com.foreach.quasar.QuasarHelloWorldKt</argument>
</arguments>
</configuration>
</plugin>
Чтобы использовать этот плагин и запустить наше приложение, мы запустим Maven:
mvn compile dependency:properties exec:exec
3. Реализация сопрограмм
Для реализации сопрограммы мы будем использовать Fibers
из библиотеки Quasar. Волокна
предоставляют облегченные потоки , которыми будет управлять JVM, а не операционная система. Поскольку они требуют очень мало оперативной памяти и гораздо меньше нагружают ЦП, мы могли бы иметь миллионы таких приложений в нашем приложении, не беспокоясь о производительности.
Чтобы запустить файбер,
мы создаем экземпляр класса Fiber<T>
, который будет обертывать код, который мы хотим выполнить, и вызываем метод запуска
:
new Fiber<Void>(() -> {
System.out.println("Inside fiber coroutine...");
}).start();
4. Вывод
В этой статье мы рассказали, как реализовать сопрограммы с помощью библиотеки Quasar. То, что мы здесь видели, — это лишь минимальный рабочий пример, а библиотека Quasar способна на гораздо большее.
Пожалуйста, найдите весь исходный код на GitHub .