Bonjour j'ai un petit problème d'implémentation. Je veux a tout prix éviter de laisser une boucle active dans mon programme, j'avais trouvé une solution intéressant mais finalement non...
Mon application doit pouvoir enregister un certain nombre de requete qui seront geré par un autre thread. Ce thread ne doit pas tourner a l'infini si la liste de requete est vide mais s'endormir et se reveillée dès qu'une requete est enregistrée.
ce que je voudrais eviter :
Le problème avec cette méthode c'est que j'ai une boucle active dans mon thread ce qui est tres mauvais pour les performances.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 class A implements Runnable { private ConcurrentLinkedQueue<Search> gSearches; A { gSearchs = new ConcurrentLinkedQueue<Search>(); new Thread(this, "SearchManager").start(); } void run() { while (true) { Search tmp; if ((tmp == gSearches.poll()) != null) { // traitement de la recherche } } } public void registerSearch(Search toRegister) { gSearches.add(toRegister); } }
Premiere solution:
Je pensais régler mon problème en utilisant cette méthode mais le problème est que si le traitement de la recherche est long et que j'essaye d'enregistrer une autre recherche pendant qu'une recherche est en cours, la récupération du lock me bloque.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 class A implements Runnable { private ConcurrentLinkedQueue<Search> gSearches; private Lock gLock; private Condition gFillList; A { gSearchs = new ConcurrentLinkedQueue<Search>(); gLock = new ReentrantLock(); gFillList = gLock.newCondition(); new Thread(this, "SearchManager").start(); } void run() { gLock.lock(); try { while (true) { Search mCurrentSearch; while ((mCurrentSearch = gSearches.poll()) == null) // gestion des spurious wakeup gFillList.await(); // gestion de la recheche. } } catch (InterruptedException e) { // gestion... } finally() { gLock.unlock(); } } public void registerSearch(Search toRegister) { gSearches.add(toRegister); gLock.lock(); gFillList.signal(); gLock.unlock(); } }
Comment faire ?javadoc:
If the lock is held by another thread then the current thread becomes disabled for thread scheduling purposes and lies dormant until the lock has been acquired, at which time the lock hold count is set to one.
Partager