Bonjour tout le monde,

je m'amuse depuis quelques temps à manipuler des threads et j'aurai souhaité savoir si je m'y prends bien.

J'ai un calcul de base à faire de TRES nombreuses fois pour lequel seules les conditions de départ changent. Donc je souhaite lancer un calcul par CPU, mais ne pas avoir à recréer mes threads. Donc je veux les réutiliser.

Voilà schématiquement ce que j'ai fait :
Code java : 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 
public class MaClasse
{
 
/** Un objet pour bloquer/débloquer (mettre en attente) la classe mère.*/
public Object object = new Object() ;
 
/** Mes threads.*/
protected MonThread[] threads = null ;
 
 
public MaClasse(int nbCPU)
	{
	threads = new MonThread[nbCPU] ;
	for (int i=0 ; i < nbCPU ; i++)
		{
		threads[i] = new MonThread(this) ;
		threads[i].start() ;
		}
	}
 
 
public void ExecuterTravail()
	{
	while ( EncoreDuTravail )
		{
		if ( !ThreadLibre ) // Pas de thread libre => on attend.
			synchronized ( object )
				{
				try	{
					object.wait() ;
					}
				catch ( InterruptedException e )
					{
					e.printStackTrace() ;
					}
				}
 
		int free = TrouverUnThreadLibre() ; // On trouve un thread libre
		DonnerConditionsAuThreadLibre(free) ; // On lui passe les instructions pour le calcul.
 
		synchronized( threads[free].thread ) // On relance le thread pour le nouveau calcul
			{
			threads[free].thread.notify() ;
			}
		}
	}
 
 
 
 
private class MonThread extends Thread
{
/** Pour bloquer/débloquer le thread.*/
public Object thread = new Object() ;
 
private MaClasse parent = null ;
 
 
public MonThread(MaClasse parent)
	{
	this.parent = parent ;
	}
 
 
 
public void run()
	{
	while ( true )
		{
		try	{
			synchronized ( thread )
				{
				thread.wait() ; // On bloque immédiatement pour attendre les instructions.
				}
			}
		catch(InterruptedException e)
			{
			e.printStackTrace() ;
			}
 
		OnFaitLeTravail() ; // Réalisation du boulot par le thread. Durée de 2 à 10 secondes.
 
		synchronized ( parent.object ) // On relance la classe mère qui attendait un thread de libre.
			{
			parent.object.notify() ;
			}
		}
}
 
}
En résumé, la classe mère MaClasse débloque les threads lorsqu'elle leur a donné les conditions de travail et chaque thread débloque la classe mère lorsqu'il est libre.

Est ce que c'est la bonne façon de faire ?
A mon avis non, mais dans ce cas comment faire ?

Merci par avance