Bonjour,
Je suis face à un problème de multithread et j'aurais besoin d'un coup de main pour trouver une solution.
Mon système actuel :
J'ai un main qui exécute plusieurs threads d'après une liste de tache. La liste de tache étant très longue je limite le nombre de thread simultané grâce à un compteur que j'incrémente quand un thread est lancé et que je décrémente lorsqu'il se termine. Lorsque la limite du nombre de thread est atteinte je met le main en attente sur une variable de condition. Un signal est lancé à chaque fois qu'un thread se termine.
Voici le code :
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 for (Page page : pages) { synchronized(this.threadMonitor) { while(this.nbThread >= this.settings.getMaxThread()) { try { this.threadMonitor.wait(); } catch (InterruptedException e) {System.err.println("InterruptedException - threadMonitor.wait");} } this.nbThread++; threadPages[count] = new ThreadElement(page); threadPages[count].start(); count++; } } for (ThreadElement thread : threadPages) { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } }Ceci fonctionne bien mais je voudrais aller plus loin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public void decremNbThread() { synchronized (this.threadMonitor) { this.nbThread--; this.threadMonitor.notify(); } }
Mon problème :
Je veux que chaque thread ainsi créé puisse lui aussi créer des threads d'après une sous liste de tache tout en conservant la limite totale de thread.
Mais d'après moi un tel système peut être bloquant car chaque thread peut attendre une place pour exécuter une sous tache mais sans libérer sa place.
Ma première idée est de compter un thread en attente comme ne faisant pas partie du compte, si un thread veut lancer ses fils il commencer par décrémenter le compteur. Mais j'ai peur que le nombre de thread en attente s'envole.
Mes questions :
Existe il une façon de résoudre le problème que j'ai énoncé ?
Dans le main, le fait que beaucoup de threads soit en attente du join est il un problème ? (plusieurs milliers)
Si je veux que les sous-taches se fassent en priorité, la méthode Thread.setPriority peut elle m'aider ? Comment ?
Ça fait beaucoup de question en suspend, j'espère que quelqu'un saura me répondre![]()
Partager