Доступные библиотеки Coroutine на Java

Я хотел бы сделать некоторые вещи на Java, которые были бы яснее, если бы они были написаны с использованием параллельных подпрограмм, но для которых streamи с полным streamом являются серьезными излишествами. Ответ, конечно же, заключается в использовании сопрограмм , но в стандартных библиотеках Java не поддерживается поддержка сопрограмм, и быстрый Google на нем вызывает намеки на то, что здесь или там, но ничего существенного.

Вот что я нашел до сих пор:

  • JSIM имеет class coroutine, но он выглядит довольно тяжеловесным и, похоже, с streamами в точках. Дело в том, чтобы уменьшить сложность полнопоточной резьбы, а не добавлять к ней. Далее я не уверен, что class можно извлечь из библиотеки и использовать самостоятельно.
  • Xalan имеет class набора сопрограмм, который делает подобный сопрограмме материал, но опять же сомнительно, если это может быть осмысленно извлечено из общей библиотеки. Похоже, он реализован как жестко контролируемая форма пула streamов, а не как фактические сопрограммы.
  • Там есть проект Google Code, который выглядит так, как мне нужно, но, если что-либо, он выглядит более тяжелым, чем использование streamов. Я в основном нервничаю от чего-то, что требует программного обеспечения для динамического изменения байт-кода JVM во время выполнения, чтобы выполнить свою работу. Это похоже на излишний и похоже на то, что вызовет больше проблем, чем сопроцессоры. Кроме того, похоже, что он не реализует всю концепцию coroutine. Своим взглядом он дает функцию yield которая просто возвращается к вызову. Правильные сопрограммы позволяют yield контроль над любой известной сопрограммой напрямую. В принципе, эта библиотека, тяжелая и страшная, только дает вам поддержку iteratorам, а не полностью общим сопрограммам.
  • Многообещающе названная Coroutine для Java терпит неудачу, потому что это решение для платформы (очевидно, использующее JNI).

И это все, что я нашел.

Я знаю о родной поддержке JVM для сопрограмм в машине Da Vinci, и я также знаю о трюке продолжения JNI для этого. Однако для меня это не очень хорошие решения, поскольку я не обязательно буду контролировать, на какой VM или платформе будет работать мой код. (Действительно, любая система манипулирования байт-кодами будет сталкиваться с аналогичными проблемами – было бы лучше всего, если бы это была чистая Java, если это возможно. Runtime bytecode-манипуляция ограничивала бы меня от использования этого на Android, например.)

Так у кого-нибудь есть указатели? Возможно ли это? Если нет, возможно ли это в Java 7?


Отредактировано для добавления:

Просто чтобы убедиться, что путаница содержится, это связанный с моим вопросом вопрос, но не тот. Этот человек ищет существующую реализацию, чтобы избежать излишнего повторного использования колеса. Другой вопрос – вопрос о том, как можно было бы реализовать сопрограммы на Java, если этот вопрос окажется неопровержимым. objective состоит в том, чтобы задавать разные вопросы по различным темам.


Далее отредактирован, чтобы добавить:

Ответ выбран . Однако некоторые комментарии в порядке. Библиотека указала, что это не библиотека сопрограмм, так что она технически не отвечает на мой вопрос. Однако, как говорится, он имеет два края над проектом Google Code, связанным с выше:

  1. Оба решения используют обработку байт-кода, но выбранная библиотека позволяет использовать статическую байт-кодовую манипуляцию, которая делает ее пригодной для использования в Android и других несоответствующих пакетах JVM.
  2. В проекте Google Code не выполняются полные сопрограммы. Хотя библиотека ответа даже не выполняет сопрограммы, она делает что-то более важное: она обеспечивает хороший, основополагающий инструмент для переливания моих собственных полнофункциональных сопрограмм.

Javaflow – это реализация продолжения, это, вероятно, позволит вам это сделать. Однако он использует манипуляции с байт-кодом.

В любом случае, похоже, что вы пытаетесь сделать ООП с простым C. Это выполнимо, но это не значит, что вы должны это делать.

Рамка Kilim реализует сопрограммы с использованием перезаписи байтового кода. Я сам использовал его для реализации легковесных процессов в Erjang , и он очень стабилен и на удивление быстро подходит для перезаписывания байт-кода.

Куроли Килима взаимодействуют с использованием почтовых ящиков, поэтому я использую структуру для моделирования актеров Erlang. Но он также может быть использован для выполнения сопрограмм в модели с общей памятью.

Что вы думаете об этой библиотеке продолжений, написанной Маттиасом Манном? Я скопировал плюсы и минусы с веб-сайта создателя, чтобы облегчить обсуждение. Важно посмотреть тесты в исходном коде, чтобы увидеть за пределами одного примера на веб-сайте.

http://www.matthiasmann.de/content/view/24/26/

Давайте начнем с того, что вы получите:

  • Напишите простой последовательный код – вам больше не нужно создавать государственные машины вручную
  • Никакие нити не созданы или не нужны – нет проблем с синхронизацией нескольких streamов
  • Никакое создание мусора из выполнения кода
  • Очень маленькая рабочая нагрузка
  • Изменены только подозрительные вызовы методов – все вызовы в вашу стандартную библиотеку (например, java.util. * И т. Д.) Вообще не затрагиваются.
  • Полная поддержка сериализации
  • Вы можете сохранить состояние выполнения сопрограмм как часть состояния игры в вашей игре сохранения без дополнительного кода. Это, конечно, требует, чтобы ваши classы и типы данных, которые вы используете в своих сопрограммах, сериализуемы. Полная поддержка обработки исключений и, наконец, блоков
  • Автономная предварительная обработка не замедляет время загрузки приложения. Разумеется, возможно использование инструментария времени исполнения.
  • Очень маленькая библиотека времени исполнения – менее 10 Кбайт (несжатая JAR) лицензия BSD

Со всеми этими замечательными функциями – вы можете просить о недостатках. Ну, конечно, есть несколько недостатков:

  • Конструкторы и статические инициализаторы не могут быть приостановлены
  • Приостановленные методы не могут быть синхронизированы или иметь синхронизированные блоки
  • Вам необходимо загрузить библиотеку ASM3 для запуска инструментальной задачи
  • Вы не можете вызвать метод suspendable с reflectionм

Проблема синхронизации может быть решена путем помещения кода, который требует использования синхронизации в свой собственный метод.

Ваши требования выглядят так:

  • легкий – не основанный на Threads,
  • не полагаться на собственный код и
  • без использования модификации байт-кода.

У меня неприятное ощущение, что эти требования исключили все разумные страtagsи для реализации сопрограмм на Java.

теперь Play Framework обеспечивает продолжение Javaflow. Поскольку Play обеспечивает такое удобство в других областях, вы можете начать с него.

http://www.playframework.org/documentation/1.2RC2/releasenotes-1.2#Continuations

Если вы используете Java, на конец 2017 года доступны 2 варианта:

  • Сопрограммы
  • Tasclate-Javaflow

Оба они основаны на commons-javaflow – они перезаписывают ваш код на уровне байт-кода, чтобы заставить работать.

Я поддерживаю Coroutines. Во-вторых, это быстро, он поддерживает все основные системы сборки и поддерживает сериализацию / версию ваших сопрограмм. Нижняя сторона заключается в том, что API имеет несколько отклонений от commons-javaflow.

Vsilaev поддерживает Tasclate-Javaflow – я не использовал его, поэтому я не могу говорить об этом, но он поддерживается, и, глядя на примеры, API-интерфейс приближается к значению commons-javaflow.

Существуют также языковые возможности в Kotlin и Scala (и, возможно, другие языки на основе JVM), которые позволяют использовать сопрограммы. Но перед переключением языков вы должны знать, что Kotlin, Scala или что-то вроде JVM-языка du jour сегодня не является и никогда не будет Java. Независимо от того, что делает на заднем плане, чтобы заставить работу работать, может не сработать, когда будет выпущена следующая версия JVM.

Люди, которые поддерживают JDK в Oracle, имеют опыт использования этих сторонних JVM-языков в качестве маркетинговых исследований. Если высокоуровневая функция добавляется на сторонний JVM-язык, и она достаточно популярна, они будут включать ее в Java. Это то, что происходит прямо сейчас с сопрограммами. Существует проект OpenJDK под названием Project Loom , целью которого является добавление сопрограммы к языку Java.

Это еще первые дни для Project Loom. Если вы критически просматриваете это предложение, это беспорядок. Я уверен, что со временем это стабилизируется, но то, что мы в конечном итоге получим, может полностью отличаться от того, что многие из нас ожидают.

Чтобы повторить, ваши варианты должны либо использовать один из инструментов инструментария байткода, либо переключать языки. Project Loom все еще в ранние дни, и есть вероятность, что он никогда не сможет быть добавлен в Java.

Quasar реализует Go-like сопрограммы и каналы среди других функций, используя продолжения.

Более подробные сведения, контрольные показатели и ссылки на Quasar в другом ответе .

Я проверил связанный с вами вопрос, который вы связали, и для жизни меня я не могу понять, что так плохо в streamах. В streamах Java никогда не существуют собственные streamи, они представляют собой просто изолированные исполнительные элементы, которые в зависимости от контекста могут работать как собственный собственный stream, если это выгодно, то есть разделение больших блоков выполнения на собственные streamи является умным, а небольшие – всего несколькими более разумно из-за накладных расходов.

Тем не менее, Java / JDK не имеет собственных сопрограмм, доступных для высокоуровневых программистов. JDK7 ( всякий раз, когда это выходит ) будет иметь то, что известно как jsr166y, которое представляет собой структуру Fork / Join от Doug Lea. Для получения технической информации, проверьте этот PDF-файл . Лиа сама. На практике Fork / Join добавляет еще один ( полезный! ) Уровень детализации поверх внутренней streamовой модели Java, которая должна помочь вам достичь того, чего вы хотите.

  • Как найти объект в ArrayList по свойству
  • Как определить день недели, пройдя конкретную дату?
  • Eclipse: Как создать исполняемую банку с внешней банкой?
  • Почему бы не затмить кислородный старт (в первый раз)?
  • Если частные вспомогательные методы являются статическими, если они могут быть статическими
  • Передача нескольких переменных в @RequestBody controllerу Spring MVC с использованием Ajax
  • Как создать class Java, который реализует один интерфейс с двумя универсальными типами?
  • Java: Instanceof и Generics
  • Есть ли эффективный инструмент для преобразования кода C # в Java-код?
  • Как читать XML с помощью XPath в Java
  • Встраивать Java в приложение на C ++?
  • Давайте будем гением компьютера.