Доступные библиотеки сопрограммы в Java

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

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

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

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

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

У кого-либо есть какие-либо указатели? Это даже возможно? В противном случае это будет возможно в Java 7?


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

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


Далее отредактированный для добавления:

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

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

42
задан Community 23 May 2017 в 11:46
поделиться

3 ответа

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

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

12
ответ дан 26 November 2019 в 23:59
поделиться

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

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

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

5
ответ дан 26 November 2019 в 23:59
поделиться

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

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

-2
ответ дан 26 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: