Les méthodes wait, notify et notifyAll sont les dernières méthodes natives de la classe Object. Par conséquent, ces méthodes ne peuvent pas être remplacées par des sous-classes. La classe Object est la superclasse de toutes les classes, il existe donc les trois formes suivantes d'appel de wait et d'autres méthodes dans le programme.
Copiez le code comme suit :
attendre();//Méthode 1 :
this.wait();//Méthode 2 :
super.wait();//Méthode 3
void notifyAll()
Débloque tous les threads qui appellent la méthode wait sur cet objet. Cette méthode ne peut être appelée que dans une méthode synchronisée ou un bloc synchronisé. Si le thread actuel n’est pas le détenteur du verrou, cette méthode lève une IllegalMonitorStateException.
annuler notifier()
Sélectionnez aléatoirement un thread qui appelle la méthode wait sur l'objet pour le débloquer. Cette méthode ne peut être appelée que dans une méthode synchronisée ou un bloc synchronisé. Si le thread actuel n’est pas le détenteur du verrou, cette méthode lève une IllegalMonitorStateException.
annuler l'attente()
Fait entrer le thread dans un état d'attente jusqu'à ce qu'il soit réveillé par d'autres threads via notify() ou notifyAll. Cette méthode ne peut être appelée qu’au sein d’une méthode synchronisée. Si le thread actuel n’est pas le détenteur du verrou, cette méthode lève une IllegalMonitorStateException.
Annuler l'attente (long millis) et annuler l'attente (long millis, int nanos)
Fait entrer le thread dans un état d'attente jusqu'à ce qu'il soit averti ou que le temps spécifié s'écoule. Ces méthodes ne peuvent être appelées qu’au sein de méthodes synchronisées. Si le thread actuel n’est pas le détenteur du verrou, cette méthode lève une IllegalMonitorStateException.
Object.wait(), Object.notify() et Object.notifyall() doivent être écrits dans la méthode synchronisée ou dans le bloc synchronisé. En effet, ces méthodes nécessitent que le thread exécutant actuellement la méthode object.wait() possède la méthode. objet. Même si vous êtes sûr que le thread contextuel actuel possède le verrou d'objet, vous ne pouvez pas écrire d'instructions telles que object.wait() dans le contexte actuel. comme:
Copiez le code comme suit :
paquet edu.sjtu.erplab.ObjectTest ;
classe A
{
public synchronisé void printThreadInfo() lève InterruptedException
{
Fil t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
classe publique ObjectWaitTest {
public static void main (String args[])
{
A a=nouveau A();
//Étant donné que la méthode printThreadInfo() renvoie InterruptedException, un bloc try-catch doit être utilisé ici.
essayer {
a.printThreadInfo();
attendre();
} catch (InterruptedException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
}
Une erreur sera signalée lors de l'exécution du programme et les résultats sont les suivants :
ID du fil : 1, Nom du fil : principal
Exception dans le thread "main" java.lang.IllegalMonitorStateException
sur java.lang.Object.wait (méthode native)
à java.lang.Object.wait(Object.java:485)
sur edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)
La bonne façon de l'écrire devrait être
Copiez le code comme suit :
paquet edu.sjtu.erplab.ObjectTest ;
classe A
{
public synchronisé void printThreadInfo() lève InterruptedException
{
Fil t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
// this.wait(); //Continue d'attendre
this.wait(1000);//Attendez 1000 ms
// super.wait(1000);
}
}
classe publique ObjectWaitTest {
public static void main (String args[])
{
A a=nouveau A();
//Étant donné que la méthode printThreadInfo() renvoie InterruptedException, un bloc try-catch doit être utilisé ici.
essayer {
a.printThreadInfo();
//attendre();
} catch (InterruptedException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
Fil t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}