2012-06-16 3 views
3

Pour certaines recherches académiques, j'ai besoin de simuler plusieurs threads fonctionnant sur un seul processeur. Je veux être capable d'insérer des appels * call_scheduler() * dans mon code, dans lequel le "thread" actuel va s'arrêter (se rappeler dans quelle ligne de code il est) et une fonction d'ordonnancement décidera quel thread laisser aller .Simulation de la planification des threads en Java (stackless java?)

En python, ceci pourrait être implémenté en utilisant python sans pile. Y a-t-il une alternative java?

Je pourrais l'implémenter en utilisant des vrais threads et quelques files d'attente de messagerie (ou pipes) qui forceront seulement un thread à courir à la fois - mais c'est une solution laide et problématique.

+0

Je pense qu'il n'y a pas de façon explicite de le faire en java, vous devez juste écrire quelques lignes de code et vous pouvez utiliser des sémaphores et des files d'attente prioritaires –

Répondre

0

Votre question:

je pourrais mettre en œuvre à l'aide de fils réels et des files d'attente de messagerie (ou tubes) that will force only one thread to run at a time - mais ceci est une solution laide et problématique

Eh bien, si vous voulez qu'un seul thread à exécuter à la fois, en contrôlant l'accès du fil sur l'objet d'une manière plus propre, puis utilisez la Semaphores in java.util.concurrent package.

Semaphores sem = new Semaphores(1); // 1 ici marquera qu'un seul thread peut avoir accès

utilisez sem.acquire() to get the key of the object, and when its done, use sem.release() alors seulement un autre thread aura accès à cet objet.

+0

Mais je veux pouvoir contrôler depuis le programmeur continuer - donc j'ai besoin d'un tableau de sémaphores, un pour chaque fil. – Oren

+0

créer une HashMap de sémaphores, donc vous pouvez les identifier par leurs clés, comme first_thread, second_thread ... etc –

+0

Le programmateur natif est assez intelligent pour comprendre que tous les threads attendent le sémaphore et qu'un seul thread peut être actif - donc il n'y a aucune raison de faire une pause? – Oren

1

Pour threads utilisateur coopératifs vous pouvez utiliser les continuations d'Apache: http://commons.apache.org/sandbox/javaflow/

Je serais intéressé de savoir comment mettre en œuvre un planificateur préemptive avec ce paquet continuations

1

acteurs Scala cadre comme Akka faire. Chaque thread gère de nombreux acteurs, c'est ainsi qu'ils ont créé si efficacement. Je recommande de regarder leur code source.