OVH Cloud OVH Cloud

Fifo thread wait et notify .. que du bonheur

2 réponses
Avatar
news.wanadoo.FR
Bonjour,

J'ai un projet a realiser en java pour demain ... autant dire que ca va etre
chaud.....

Un partie du probleme est le suivant

Des processus , donc des threads sont des clients et doivent passer par une
caisse quelconque.
La queueu est commune a toutes les caisses ( comme a la poste).

Si le queue est vide -> regarder si y'a de la place dans une des caisses .
Si oui y aller sinon entrer dans queue.
Si queue est pleine partir.
Si il y a de a place dans queue alors y rentrer.

Le probleme avec un solution classique est que lorsqu' un client partira de
la caisse en faisant un notify il va reveiller quelqu'un de la queue au
hasard.
Et dans ce projet c'est le premier entrer dans la queue qui doit etre le
premier a en sortir.
On peut supposer que l'ordonnanaceur de java est FIFO mais ceci n'est pas
entierement exact et rigoureux.

Voici mes deux pistes de recherche actuelle

faire un notifyall()
les client sont reveillé
il font numplacedansqueue--
si numplacedansqueue!=-1
alors il se rendort
sinon
il va a une caisse de dispo
ce qui suppose de gerer des indices de premier entré et premier sorti dans
la file etc etc etc...


ou

le client passe n'est plus un processus mais plusieurs les un a l suite des
autres:
d'abord un acheteur
puis un payeur


l'acheteur arrive aux caisse si il y a de la place
on stocke ses parametre
on le tue et
on creer un payeur avec les memes parametres

si la queue n'est pas pleine
on stocke ses parametre dans un tableau de record par ex
tableau[indiceentrée]=parametres du acheteur
indiceentree++;
indiceentre = indicentree % taille totale queue
on le tue

si la queue est pleine
j'en sais rien encore .. ;-)

lors d'un sortie de caisse
on fait un new payeur(tableau[indicesortie])
indice sortie ++;
indice sortie = indicesortie % taille totale queue



On peut remarquer pour finir que ces deux solutions sont nulles. C'est tres
moches comme programation.
Et je ne le erais qu'en dernier recours.

Le meiux serait d'endormir dans u ntableau de thread.
Puis de reveiller un seul thread et pas n'importe lequel :le premier
element du tableau.

Est possible

Il parait que non
Je pense que si
Mais a quel prix

Je n'ai jamais fait de java avant aujourd'hui il me reste donc cette
nuit.......


--------Et je ne dois pas importer autre choses que java.*-------

Donc pas de librairie magique auquel personne ne comprend rien et qui marche
apr mirracle ;-)


Si quelqqu'un a une idée ou peut me dire qi l'une de mes deux solutions est
valable et pertinehntes et pas trop moche finalement ....

Merci d'avance a tous

Tche

2 réponses

Avatar
Benoît Chauvet
news.wanadoo.FR wrote:
Bonjour,
Bonjour,


J'ai un projet a realiser en java pour demain ... autant dire que ca
va etre chaud.....


Halala, ces étudiants qui s'y prennent toujours au dernier moment ! :D

Bon, ton problème me semble assez simple si tu le prennais par l'autre bout.
Au lieu de te focaliser sur tes threads, tu devrais réfléchir à une classe
file d'attente qui :
- mémoriserait les thread en attente (avec leurs indices)
- réveillerait le premier lorsqu'un place se libère.

Tu peux imaginer un moyen quelconque pour ce dernier point. Le plus simple
si le mécanisme standard des thread ne te suffit pas est de définir une
interface pour tes Threads qui te permettra de leur signaler (par la mise à
jour d'un boolean, ou plus simplement l'affectation d'une caisse) qu'ils ont
le droit d'avancer ou non.
Ainsi, la classe centrale FileDAttente gère le placement dans les caisses,
et affecte une caisse au premier thread de la file. Je pense d'ailleurs que
cette gestion doit aussi être gérée par cet objet lors de l'arrivée d'un
thread, même si la file est vide. Ca permet d'éviter que l'un des thread
viole les contraintes définies, et ne grille tout le monde dans la file
d'attente (chose très agacante, surtout en cette periode de sport d'hiver
qui commence)

En résumé, tous les threads de la file sont en attente (avec un wait) et tu
utilises notifyAll pour les réveiller, mais ils vérifient tous avant si une
caisse leur a été affectée avant de continuer. Dans le cas contraire, ils se
rendorment (et seul le premier avance, donc)

Bon courage

--
Orabîg

Avatar
Erwan David
"Benoît Chauvet" écrivait :

news.wanadoo.FR wrote:
Bonjour,
Bonjour,


J'ai un projet a realiser en java pour demain ... autant dire que ca
va etre chaud.....


Halala, ces étudiants qui s'y prennent toujours au dernier moment ! :D

Bon, ton problème me semble assez simple si tu le prennais par l'autre bout.
Au lieu de te focaliser sur tes threads, tu devrais réfléchir à une classe
file d'attente qui :
- mémoriserait les thread en attente (avec leurs indices)
- réveillerait le premier lorsqu'un place se libère.

Tu peux imaginer un moyen quelconque pour ce dernier point. Le plus simple
si le mécanisme standard des thread ne te suffit pas est de définir une
interface pour tes Threads qui te permettra de leur signaler (par la mise à
jour d'un boolean, ou plus simplement l'affectation d'une caisse) qu'ils ont
le droit d'avancer ou non.
Ainsi, la classe centrale FileDAttente gère le placement dans les caisses,
et affecte une caisse au premier thread de la file. Je pense d'ailleurs que
cette gestion doit aussi être gérée par cet objet lors de l'arrivée d'un
thread, même si la file est vide. Ca permet d'éviter que l'un des thread
viole les contraintes définies, et ne grille tout le monde dans la file
d'attente (chose très agacante, surtout en cette periode de sport d'hiver
qui commence)

En résumé, tous les threads de la file sont en attente (avec un wait) et tu
utilises notifyAll pour les réveiller, mais ils vérifient tous avant si une
caisse leur a été affectée avant de continuer. Dans le cas contraire, ils se
rendorment (et seul le premier avance, donc)


Une autre solution est que chaque Thread attende sur un objet
différent (au hasard lui même...) et que l'objet FIFO ne notifie que
le thread qui doit redémarrer.