Le contenu impliqué dans ce chapitre comprend:
1. Introduction à Sleep ()
2. Exemple de sommeil ()
3. Comparaison entre le sommeil () et l'attente ()
1. Introduction à Sleep ()
Sleep () est défini dans thread.java.
La fonction de Sleep () est de laisser le thread actuel dormir, c'est-à-dire que le thread actuel entrera de "l'état de course" à "l'état de sommeil (blocage)". Sleep () spécifiera le temps de sommeil, et le temps de sommeil sera supérieur à / égal au temps de sommeil; Le CPU à s'exécuter.
2. Exemple de sommeil ()
Ce qui suit est un exemple simple pour démontrer l'utilisation du sommeil ().
La copie de code est la suivante:
// Code source de Sleeptest.java
classe threada étend Thread {
public threada (nom de chaîne) {
super (nom);
}
public synchronisé void run () {
essayer {
pour (int i = 0; i <10; i ++) {
System.out.printf ("% s:% d / n", this.getName (), i);
// Quand je peux être divisé par 4, dormir pendant 100 millisecondes
si (i% 4 == 0)
Thread.Sleep (100);
}
} catch (InterruptedException e) {
e.printStackTrace ();
}
}
}
classe publique Sleeptest {
public static void main (String [] args) {
Threada t1 = new Threada ("t1");
t1.start ();
}
}
Résultats en cours:
La copie de code est la suivante:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
Description des résultats:
Le programme est relativement simple, démarrez le thread T1 dans le thread principal principal. Une fois le T1 démarré, lorsque le calcul I dans T1 peut être divisible par 4, T1 dormira pendant 100 millisecondes à travers le fil. Sleep (100).
Comparaison entre le sommeil () 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 Sleep () est de permettre au thread actuel de saisir «l'état de sommeil (blocage)» de «l'état de course».
Cependant, Wait () libère le verrou de synchronisation de l'objet, tandis que Sleep () ne libère pas le verrou.
L'exemple suivant montre que Sleep () ne libérera pas le verrou.
La copie de code est la suivante:
// Code source de sleeplocktest.java
classe publique SleeplockTest {
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) {
essayer {
pour (int i = 0; i <10; i ++) {
System.out.printf ("% s:% d / n", this.getName (), i);
// Quand je peux être divisé par 4, dormir pendant 100 millisecondes
si (i% 4 == 0)
Thread.Sleep (100);
}
} catch (InterruptedException e) {
e.printStackTrace ();
}
}
}
}
}
Résultats en cours:
La copie de code est la suivante:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
T2: 0
T2: 1
T2: 2
T2: 3
T2: 4
T2: 5
T2: 6
T2: 7
T2: 8
T2: 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 la course à T1, bien qu'il appelle le thread.Sleep (100); Parce que T1 ne libère pas le "Lock synchrone tenu par OBJ"!
Notez que si nous commentons synchronisés (OBJ) et exécutons à nouveau le programme, T1 et T2 peuvent être basés les uns aux autres. Ce qui suit est le code source après la synchronisation du morceau de commentaire (OBJ):
La copie de code est la suivante:
// SleeplockTest.java Code source (commenté synchronisé (OBJ))
classe publique SleeplockTest {
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) {
essayer {
pour (int i = 0; i <10; i ++) {
System.out.printf ("% s:% d / n", this.getName (), i);
// Quand je peux être divisé par 4, dormir pendant 100 millisecondes
si (i% 4 == 0)
Thread.Sleep (100);
}
} catch (InterruptedException e) {
e.printStackTrace ();
}
//}
}
}
}