Я хотел бы сделать кое-что на Java, которое было бы более ясным, если бы оно было написано с использованием параллельных процедур, но для которых потоки с полным потоком являются серьезными излишествами. Ответ, конечно, заключается в использовании сопрограммы, но, похоже, нет поддержки сопрограммы в стандартных Java-библиотеках и в быстрой Google на нем возникают дразнящие намеки здесь или там, но ничего существенного.
Вот что я нашел до сих пор:
- JSIM имеет класс сопрограммы, но он выглядит довольно тяжелым и сложным, казалось бы, с потоки в точках. Дело в том, чтобы уменьшить сложность полнопоточной резьбы, а не добавлять к ней Это. Далее я не уверен, что класс можно извлечь из библиотеки и использовать самостоятельно.
- Xalan имеет класс набора сопрограмм, который выполняет сопроводительные материалы, но снова это сомнительно, если это могут быть осмысленно извлечены из общей библиотеки. Он также выглядит как выполненный как жестко контролируемая форма пула потоков, а не как фактические сопрограммы.
- Здесь Проект Google Code, который выглядит так, как я за ним, но если что-то еще выглядит
тяжелее, чем использование потоков. Я в основном нервничаю от чего-то, что требует программного обеспечения для
динамически изменять байт-код JVM во время выполнения, чтобы выполнить свою работу. Это похоже на излишний
то, что вызовет больше проблем, чем coroutines будет решать. Кроме того, похоже, что это не
реализовать всю концепцию coroutine. Своим взглядом он дает функцию
yield
, которая просто возвращает для вызывающего. Правильные сопрограммы позволяютyield
напрямую передавать управление любой известной сопрограмме. В принципе, эта библиотека, тяжелая и страшная, только дает вам поддержку итераторам, а не полностью общие сопрограммы. - Многообещающе названный Coroutine для Java терпит неудачу, потому что он зависит от платформы (очевидно, используя JNI).
И это обо всем, что я нашел.
Я знаю о встроенной поддержке JVM для сопрограмм в машине Da Vinci, и я также знаю о трюк продолжения JNI для этого. Однако для меня это не очень хорошие решения, поскольку я не обязательно буду контролировать, на какой VM или платформе будет работать мой код. (Действительно, любая система манипулирования байт-кодами будет сталкиваться с аналогичными проблемами - лучше всего было бы использовать эту чистую Java. Возможно, использование байт-кода в режиме исполнения времени ограничило бы меня использованием этого на Android.)
У кого-нибудь есть указатели? Возможно ли это? Если нет, возможно ли это в Java 7?
Отредактировано для добавления:
Просто чтобы убедиться, что путаница содержится, это связанный с нами вопрос мой другой, но не тот же. В этом случае вы ищете реализацию существующей, чтобы избежать необходимости повторно изобретать колесо. Другой вопрос - вопрос о том, как можно было бы реализовать сопрограммы на Java, если этот вопрос окажется неопровержимым. Цель состоит в том, чтобы задавать разные вопросы по различным темам.
Далее отредактирован, чтобы добавить:
Выбран ответ . Однако некоторые комментарии в порядке. Библиотека указала, что это не библиотека сопрограмм, так что она технически не отвечает на мой вопрос. Однако, как сказано, он имеет два края над проектом Google Code, связанным выше:
- В обоих решениях используется обработка байт-кода, но выбранная библиотека позволяет использовать статическую байт-кодовую манипуляцию, которая делает ее пригодной для использования в Android и других несоответствующих пакетах JVM.
- В проекте Google Code не выполняются полные сопрограммы. Хотя библиотека ответов даже не выполняет сопрограммы, она делает что-то более важное: она обеспечивает хороший базовый инструмент для переливания моих собственных полнофункциональных сопрограмм.