Support Java
Support Java
Attributs
3.4 Les constructeurs :
méthodes
Certaines méthodes peuvent avoir un rôle particulier :
par exemple celui d’initialiser les attributs. Ces
3.2 Notion de classe : méthodes sont appelées des constructeurs. Exemple :
Une classe est un moule qui sert à reproduire des class Exemple
objets semblables. On dit aussi que l’objet est une {
instance de la classe. En java, les classes obéissent à //attribut
la structure suivante : int val ;
//constructeur
class <nomClasse> Exemple()
{ {
val=1 ;
//attributs }
… }
//méthodes
… Le nom du constructeur a le même nom que la classe.
} Si on créé un objet à partir de cette classe, la valeur de
la variable val sera mise à 1 automatiquement, sans
qu’il ne soit nécessaire d’appeler la fonction Exemple.
L’exemple suivant décrit une classe Voiture dont chaque Un constructeur n’admet jamais aucun type de retour.
objet (voiture) possède deux attributs (couleur et
vitesse) et deux méthodes AugmenteVitesse et 3.5 Instanciation des objets :
DiminueVitesse :
Un objet est créé par instanciation de se classe.
class Voiture { Exemple :
// attributs
int Couleur; - Voiture clio = new Voiture() ;
int Vitesse; - Exemple expl = new Exemple(1997)
Exemple : un exemple de 2 threads qui comptent de 1 à - Static boolean interrupted() : teste si le thread a été
100. Commençons donc par créer une sous-classe de interrompu.
la classe Thread, puis créons une classe permettant de - void join() ou void join( long millis) ou void(long
lancer les deux threads via la méthode main() : millis, int nanos) : attendre la mort du thread, ou
après un millis de ms ou, ms plus ns.
// LanceCompteurs.java
// - void resume() : redémarre le thread.
class ThreadCompteur extends Thread { - void run() : contient le code à exécuter pour le
int no_fin; thread.
// Constructeur
ThreadCompteur (int fin) { - void setPriority(int newpriority) : change la priorité
no_fin = fin; du thread.
} - Static void sleep(long millis) ou static void
// On redéfinit la méthode run() sleep(long millis, int nanos) : mettre en veille le
public void run () { thread pend millis ms ou ms plus ns.
for (int i=1; i<=no_fin ; i++) {
System.out.println(this.getName i); - Void start() : démarre un thread.
}
- isAlive() : retourne vrai si le thread auquel on
} applique la méthode est vivant (c'est à dire à été
} démarré par start() et que sa méthode run() n'est
// Classe lançant les threads pas encore terminée. Le thread vivant est donc
class LanceCompteurs { prêt, bloqué ou en cours d'exécution
public static void main (String args[]) {
// On instancie les threads
ThreadCompteur cp1 = new ThreadCompteur (100); 4.4 Synchronisation des threads :
ThreadCompteur cp2 = new ThreadCompteur (100);
// On démarre les deux threads En plus des méthodes décrites précédemment, il existe
cp1.start(); d’autres moyens de synchroniser les threads en Java :
cp2.start(); synchronized, wait et notify.
// On attend qu'ils aient fini de compter
while (cp1.isAlive() || cp2.isAlive) {
// On bloque le thread 100 ms
6
Mot clé synchronized verrou associé à un objet), mais ne doivent s'utiliser que
dans des méthodes synchronized.
Les problèmes d'accès concurrents se règlent en JAVA
• wait() : le thread qui appelle cette méthode est
à l'aide du mot clé synchronized, qui permet de déclarer
bloqué jusqu'à ce qu'un autre thread appelle
qu'une méthode ou un bloc d'instructions est critique :
notify() ou notifyAll(). Notons que wait() libère le
un seul thread á la fois peut se trouver dans une partie
verrou, ce qui permet à d'autres threads
synchronisée sur un objet.
d'exécuter des méthodes synchonisées du
Ce mécanisme est implémenté par la machine virtuelle
même objet.
JAVA à l'aide d'un verrou (lock, en fait un sémaphore).
• notify() et notifyAll() permettent de débloquer
Chaque objet JAVA possède un verrou. Pour exécuter
une tâche bloqué par wait(). Attention, si une
une section de code synchronisée (bloc ou méthode), il
tâche T1 appelle wait dans une méthode de
faut posséder le verrou. Si un thread commence à
l'objet O, seule une autre méthode du même
exécuter une section synchronisée, aucun autre thread
objet pourra la débloquer; cette méthode devra
ne pourra entrer dans une section synchonisée du
être synchronisée et exécutée par une autre
même objet (même par une autre méthode) tant que le
tâche T2.
verrou n'aura pas été libéré (en quittant la partie
synchronisée ou en appelant la méthode wait()).
Attention, si l'on veut synchroniser une méthode pour
tous les objets de cette classe (accès à des variables de
classes partagées par plusieurs threads), il faut que la
méthode synchronisée soit une méthode de classe Remarque : les sémaphores n’existent pas en tant que
(static). tels en java ; il faut les implémenter.