50 votes

Bibliothèques Coroutine disponibles en Java

Je voudrais faire quelques trucs en Java qui serait plus claire si l'écrit en utilisant simultanément les routines, mais pour qui plein sur les threads sont sérieux exagéré. La réponse, bien sûr, est l'utilisation de coroutines, mais il ne semble pas être tout coroutine soutien dans les bibliothèques de base de Java et un rapide Google sur il apporte alléchant allusions ici ou là, mais rien d'important.

Voici ce que j'ai trouvé pour l'instant:

  • JSIM a une coroutine classe, mais il semble assez lourd et amalgame, apparemment, avec fils à points. Le but de cela est de réduire la complexité d'enfilage, de ne pas ajouter à la c'. De plus je ne suis pas sûr que la classe peut être extraite à partir de la bibliothèque et de l'utiliser de façon autonome.
  • Xalan a une coroutine ensemble de la classe qui ne coroutine-comme truc, mais c'est encore douteux si ce peuvent être utilement extraites de l'ensemble de la bibliothèque. Aussi, il semble que c'est implémenté comme un étroitement contrôlée forme de pool de threads, non en tant que coroutines.
  • Il y a un Google Code du projet qui ressemble à ce que je suis après, mais si quelque chose, il a l'air plus poids lourd de l'utilisation de threads serait. Je suis fondamentalement nerveux de quelque chose qui nécessite un logiciel pour modifier dynamiquement le bytecode JVM au moment de l'exécution de son travail. Cela paraît exagéré, et comme quelque chose qui va causer plus de problèmes que de coroutines permettrait de résoudre. En outre, il semble comme il n'a pas mettre en œuvre l'ensemble de la coroutine concept. Par mon regard sur elle donne un yield fonction qui ne renvoie à l'invocateur. Bon coroutines autoriser yields pour transférer le contrôle à tout connu coroutine directement. Fondamentalement, cette bibliothèque, poids lourd et effrayant qu'il est, ne vous donne qu'un soutien pour les itérateurs, pas pleinement général coroutines.
  • La ce qui est prometteur nommé Coroutine pour Java échoue parce que c'est une plate-forme spécifique (de toute évidence à l'aide de JNI) solution.

Et c'est tout ce que j'ai trouvé.

Je connais le natif de la JVM de soutien pour les coroutines dans le Da Vinci Machine et je connais aussi la JNI continuations astuce pour ce faire. Ce ne sont pas vraiment de bonne solution pour moi, cependant, que je ne serait pas nécessairement avoir le contrôle sur qui virtuelle ou une plate-forme mon code fonctionne sur. (En effet, toute manipulation de bytecode système de aurait à souffrir de problèmes similaires -- il serait préférable que ce pur Java, si possible. D'exécution du bytecode à la manipulation serait de me restreindre à partir de l'utilisation de ce sur Android, par exemple.)

Si quelqu'un avez des pointeurs? Est-ce même possible? Sinon, est-il possible en Java 7?


Edité pour ajouter:

Juste pour s'assurer que la confusion est contenue, cela est lié à la question de mon autre, mais pas les mêmes. Celui-ci est à la recherche d'un existant, la mise en œuvre, dans une tentative d'éviter de réinventer la roue inutilement. L'autre est une question relative à la façon dont on pourrait aller sur la mise en œuvre de coroutines en Java, cette question devrait-elle prouver sans réplique. Le but est de conserver les différentes questions sur des threads différents.


En outre modifié pour ajouter:

La réponse est sélectionné. Certains commentaire, cependant, est dans l'ordre. La bibliothèque a souligné n'est pas une coroutine de bibliothèque, donc techniquement il n'a pas répondu à ma question. Cela étant dit, cependant, il a deux arêtes sur le Google Code du projet lié ci-dessus:

  1. Les deux solutions de l'utilisation du bytecode de la manipulation, mais la bibliothèque sélectionnée permet statique de manipulation de bytecode qui le rend utilisable dans Android et d'autres non-conformes à la JVM des piles.
  2. Le Google Code du projet n'est pas de faire plein de coroutines. Alors que la réponse de bibliothèque n'a même pas de faire coroutines à tous, il fait quelque chose de plus important: il fournit une bonne, fondateur de l'outil pour roulement de ma propre complet de coroutines.

16voto

Guillaume Points 6131

Javaflow est une implémentation de continuation, il vous laissera probablement faire cela. Il utilise cependant la manipulation de bytecode.

Quoi qu'il en soit, c'est comme si vous essayiez de faire de la programmation orientée objet avec C en clair. C'est faisable, mais cela ne signifie pas que vous devriez le faire.

11voto

Le Kilim framework implémente coroutines en utilisant octet de réécriture de code. Je l'ai utilisé moi-même pour mettre en œuvre la lumière-poids de processus dans Erjang, et il est très stable et étonnamment rapide pour le montant de bytecode de réécriture qui se passe.

Kilim de coroutines interagir en utilisant des boîtes aux lettres, j'ai donc utiliser le cadre pour modèle d'Erlang acteurs. Mais il peut tout aussi bien être utilisé pour faire de coroutines sont partagés dans une mémoire de modèle.

9voto

rrmckinley Points 168

Que pensez-vous de cette continuation de la bibliothèque écrit par Matthias Mann? J'ai copié les avantages et les inconvénients de la part du créateur du site web pour faciliter la discussion. Il est important de regarder les tests dans le code source pour voir au-delà de la un exemple sur le site web.

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

Permet de commencer avec ce que vous obtenez:

  • Écriture simple code séquentiel - vous n'avez plus besoin de créer des machines d'état à la main
  • Pas de Threads sont créés ou nécessaire - pas de multi thread problèmes de synchronisation
  • Pas de déchets de la création de l'exécution de code
  • Très petite gestion d'exécution
  • Seulement suspendable les appels de méthode sont modifiées, tous les appels dans votre bibliothèque standard (comme java.util.* etc) ne sont pas touchées.
  • Plein de sérialisation de soutien
  • Vous pouvez stocker l'état d'exécution de coroutines dans le cadre de votre état de jeu dans votre sauvegarde de jeu sans code supplémentaire. Bien sûr, cela nécessite que vos classes et de types de données que vous utilisez dans votre coroutines sont sérialisables. Support complet pour la gestion des exceptions et enfin les blocs
  • Prétraitement hors ligne ne pas ralentir le temps de chargement de l'application Bien sûr exécution de l'instrumentation est également possible.
  • Très petite bibliothèque d'exécution - moins de 10 Ko (non compressé en POT) Licence BSD

Avec toutes ces fonctionnalités, vous pouvez poser la question pour en avoir les inconvénients. Eh bien, il ya bien sûr quelques inconvénients:

  • Les constructeurs et les initialiseurs statiques ne peuvent pas être suspendu
  • Suspendable méthodes ne peuvent pas être synchronisés ou la synchronisation de blocs
  • Vous devez télécharger ASM3 bibliothèque pour exécuter la tâche de l'instrumentation
  • Vous ne pouvez pas appeler suspendable méthode, de réflexion, de

Le problème de synchronisation peut être contourné en mettant le code qui nécessite l'utilisation de la synchronisation dans sa propre méthode.

5voto

Stephen C Points 255558

Vos exigences semblent être:

  • léger - pas basé sur les threads,
  • aucune dépendance envers le code natif, et
  • pas d'utilisation de la modification du bytecode.

J'ai le mauvais pressentiment que ces exigences ont exclu toute stratégie sensée d'implémentation de coroutines en Java.

2voto

rrmckinley Points 168

le framework Play fournit maintenant des suites avec Javaflow. Parce que Play est très pratique dans d’autres domaines, vous voudrez peut-être commencer par cela.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X