Я хотел бы сделать некоторый материал в Java, который будет более ясным, если записано с помощью параллельных стандартных программ, но для которого настоящие потоки являются серьезным излишеством. Ответ, конечно, является использованием сопрограмм, но там, кажется, не поддержка сопрограммы в стандартных библиотеках Java, и быстрый Google на нем поднимает дразнящие подсказки здесь или там, но ничто существенное.
Вот то, что я нашел до сих пор:
yield
функция, которая просто возвращается к invoker. Надлежащие сопрограммы позволяют yield
s для передачи управления любой известной сопрограмме непосредственно. В основном эта библиотека, тяжеловес и страшный, как это, только оказывает Вам поддержку итераторам, не полностью общие сопрограммы.И это обо всем, что я нашел.
Я знаю о собственной поддержке JVM сопрограмм в Машине Da Vinci, и я также знаю о приеме продолжений JNI для того, чтобы сделать это. Это не действительно хорошие решения для меня, однако, поскольку я не обязательно управлял бы, на каком VM или платформе мой код будет работать. (Действительно любая система управления байт-кодом перенесла бы подобные проблемы - это будет лучшим, был этот чистый Java, если это возможно. Управление байт-кодом во время выполнения ограничило бы меня в использовании этого на Android, например.)
У кого-либо есть какие-либо указатели? Это даже возможно? В противном случае это будет возможно в Java 7?
Отредактированный для добавления:
Только, чтобы гарантировать, что беспорядок содержится, это - связанный вопрос моему другому, но не то же. Этот ищет существующую реализацию в попытке постараться не изобретать велосипед излишне. Другой является вопросом, касающимся, как можно было бы пойти о реализации сопрограмм в Java, должен этот вопрос оказываться не имеющим ответа. Намерение состоит в том, чтобы сохранить различные вопросы на различных потоках.
Далее отредактированный для добавления:
Ответ выбран. Некоторый комментарий, однако, в порядке. Библиотека указала, не библиотека сопрограммы, таким образом, она технически не отвечает на мой вопрос. Однако однако, это имеет два края по проекту Google Code, связанному с вышеупомянутым:
Javaflow - это реализация продолжения, она, вероятно, позволит вам это сделать. Однако он использует манипуляции с байт-кодом.
В любом случае, похоже, что вы пытаетесь выполнить ООП с помощью простого C. Это выполнимо, но это не значит, что вы должны это делать.
Ваши требования выглядят так:
У меня неприятное ощущение, что эти требования исключили все разумные стратегии реализации сопрограмм на Java.
Я проверил связанный вопрос, на который вы ссылались, и я не могу понять, что такого плохого в потоках. В Java потоки никогда не являются нативными потоками, это просто изолированные единицы выполнения, которые в зависимости от контекста могут выполняться как собственный нативный поток, если это выгодно, то есть разделение больших блоков выполнения на собственные потоки является разумным, в то время как сохранение небольших потоков в нескольких является более разумным из-за накладных расходов.
Тем не менее, Java/JDK не имеет встроенных корутинов, доступных для программистов высокого уровня - пока. В JDK7 (когда бы он ни вышел) будет то, что известно как jsr166y, который является фреймворком Fork/Join от Doug Lea. Для получения технической информации ознакомьтесь с этим PDF, написанным самим господином Леа. На практике Fork/Join добавляет еще один (полезный!) уровень детализации поверх внутренней модели потоков Java, что должно помочь вам достичь желаемого.