Le contenu impliqué dans ce chapitre comprend:
1. Introduction à rendement ()
2. Exemple de rendement ()
3. Comparaison entre le rendement () et l'attente ()
1. Introduction à rendement ()
Le but du rendement () est de céder. Il permet au thread actuel de saisir «l'état prêt» à partir de «l'état de course», de sorte que d'autres threads d'attente avec la même priorité peuvent obtenir des droits d'exécution; avoir la même priorité.
2. Exemple de rendement ()
Ci-dessous, voir son utilisation par l'exemple.
La copie de code est la suivante:
// Code source de rendement
classe threada étend Thread {
public threada (nom de chaîne) {
super (nom);
}
public synchronisé void run () {
pour (int i = 0; i <10; i ++) {
System.out.printf ("% s [% d]:% d / n", this.getName (), this.getPriority (), i);
// Lorsque je divise 4, appelez le rendement
si (i% 4 == 0)
Thread.yield ();
}
}
}
classe publique RendedTest {
public static void main (String [] args) {
Threada t1 = new Threada ("t1");
Threada t2 = new Threada ("T2");
t1.start ();
t2.start ();
}
}
(Une fois) Résultat de l'opération:
La copie de code est la suivante:
T1 [5]: 0
T2 [5]: 0
T1 [5]: 1
T1 [5]: 2
T1 [5]: 3
T1 [5]: 4
T1 [5]: 5
T1 [5]: 6
T1 [5]: 7
T1 [5]: 8
T1 [5]: 9
T2 [5]: 1
T2 [5]: 2
T2 [5]: 3
T2 [5]: 4
T2 [5]: 5
T2 [5]: 6
T2 [5]: 7
T2 [5]: 8
T2 [5]: 9
Description des résultats:
Lorsque "Thread T1" peut être entièrement entièrement élevé, il ne passe pas à "Thread T2". Cela montre que bien que le rendement () puisse permettre aux threads d'entrer dans "l'état prêt" de "l'état de course"; Même si ces "autres threads" ont la même priorité que le thread appelant actuellement le rendement ().
3. Comparaison entre le rendement () et l'attente ()
Nous savons que la fonction d'attente () est de permettre au thread actuel de saisir l'état "d'attente (blocage) de" l'état en cours d'exécution "et de libérer également le verrou de synchronisation. La fonction de rendement () est de céder, ce qui entraînera également le thread actuel à quitter "l'état de course". Leurs différences sont:
(01) Wait () est de laisser le thread saisir "l'attente (blocage) de l'état" de "l'état en cours d'exécution", tout en ne rendant pas () est de laisser le thread saisir "l'état prêt" de "l'état de course".
(02) Wait () est un verrou de synchronisation qui va libérer l'objet qu'il détient, tandis que la méthode de rendement () ne libérera pas le verrou.
L'exemple suivant montre que le rendement () ne libérera pas le verrou.
La copie de code est la suivante:
// Code source de rendez-vous
classe publique RendlockTest {
objet statique privé obj = nouveau objet ();
public static void main (String [] args) {
Threada t1 = new Threada ("t1");
Threada t2 = new Threada ("T2");
t1.start ();
t2.start ();
}
classe statique Threada étend Thread {
public threada (nom de chaîne) {
super (nom);
}
public void run () {
// Obtenez le verrou de synchronisation de l'objet OBJ
synchronisé (obj) {
pour (int i = 0; i <10; i ++) {
System.out.printf ("% s [% d]:% d / n", this.getName (), this.getPriority (), i);
// Lorsque je divise 4, appelez le rendement
si (i% 4 == 0)
Thread.yield ();
}
}
}
}
}
(Une fois) Résultat:
La copie de code est la suivante:
T1 [5]: 0
T1 [5]: 1
T1 [5]: 2
T1 [5]: 3
T1 [5]: 4
T1 [5]: 5
T1 [5]: 6
T1 [5]: 7
T1 [5]: 8
T1 [5]: 9
T2 [5]: 0
T2 [5]: 1
T2 [5]: 2
T2 [5]: 3
T2 [5]: 4
T2 [5]: 5
T2 [5]: 6
T2 [5]: 7
T2 [5]: 8
T2 [5]: 9
Description des résultats:
Deux threads T1 et T2 sont démarrés dans le principal thread principal. T1 et T2 feront référence au verrou de synchronisation du même objet dans run (), c'est-à-dire synchronisé (OBJ). Pendant l'opération T1, bien qu'il appelle le thread.yield (); Parce que T1 ne libère pas le "Lock synchrone tenu par OBJ"!