Implementando corutinas en Java

Esta pregunta está relacionada con mi pregunta sobreimplementaciones de rutina existentes en Java. Si, como sospecho, resulta que no hay una implementación completa de las rutinas actualmente disponibles en Java, ¿qué se necesitaría para implementarlas?

Como dije en esa pregunta, sé lo siguiente:

Puede implementar "corutinas" como subprocesos / grupos de subprocesos detrás de escena.Puede hacer cosas engañosas con el código de bytes JVM detrás de escena para hacer posibles las rutinas.La implementación JVM de la llamada "Máquina Da Vinci" tiene primitivas que hacen factibles las rutinas sin manipulación de código de bytes.Existen varios enfoques basados en JNI para las corutinas también posibles.

Abordaré las deficiencias de cada uno en tur, n.

Corutinas basadas en hilos

Esta "solución" es patológica. El objetivo de las corutinas esevitar la sobrecarga de subprocesos, bloqueo, programación del kernel, etc. Se supone que las rutinas son ligeras y rápidas y se ejecutan solo en el espacio del usuario. Implementarlos en términos de hilos de inclinación completa con estrictas restricciones elimina todas las ventajas.

JVM bytecode manipulación

Esta solución es más práctica, aunque un poco difícil de lograr. Esto es más o menos lo mismo que saltar al lenguaje ensamblador para bibliotecas de rutina en C (que es la cantidad de ellas que funcionan) con la ventaja de que solo tiene una arquitectura de la que preocuparse y acertar.

También lo limita a ejecutar solo su código en pilas JVM totalmente compatibles (lo que significa, por ejemplo, no Android) a menos que pueda encontrar una manera de hacer lo mismo en la pila no compatible. Sin embargo, si encuentra una manera de hacerlo, ahora ha duplicado la complejidad de su sistema y las necesidades de prueba.

La máquina Da Vinci

La máquina Da Vinci es genial para la experimentación, pero dado que no es una JVM estándar, sus características no estarán disponibles en todas partes. De hecho, sospecho que la mayoría de los entornos de producción prohibirían específicamente el uso de la máquina Da Vinci. Por lo tanto, podría usar esto para hacer experimentos geniales, pero no para cualquier código que espero lanzar al mundo real.

Esto también tiene el problema adicional similar a la solución de manipulación de código de bytes JVM anterior: no funcionará en pilas alternativas (como la de Android).

Implementación JNI

Esta solución representa el punto de hacer esto en Java en absoluto discutible. Cada combinación de CPU y sistema operativo requiere pruebas independientes y cada una es un punto de falla sutil potencialmente frustrante. Alternativamente, por supuesto, podría atarme a una plataforma por completo, pero esto también hace que el punto de hacer las cosas en Java sea completamente discutible.

Entonces...

¿Hay alguna forma de implementar corutinas en Java sin usar una de estas cuatro técnicas? ¿O me veré obligado a usar uno de esos cuatro que huele menos (manipulación JVM) en su lugar?

Editado para agregar:

Solo para asegurar que la confusión esté contenida, esta es unarelacionado pregunta ami otroPero no es lo mismo. Ese busca unexistente implementación en un intento por evitar reinventar la rueda innecesariamente. Esta es una pregunta relacionada con la forma en que se implementaría corutinas en Java en caso de que la otra no responda. La intención es mantener diferentes preguntas en diferentes hilos.

Respuestas a la pregunta(6)

Su respuesta a la pregunta