Le code suivant n'obtient pas notifier le lecteur de threads il exécute le programme d'écriture, puis se termine. Pourquoi est-ce comme ça? Le notifyall
doit réveiller tous les threads qui sont à l'état d'attente.Mon thread ne reçoit pas de notification et mon programme se bloque
public class Testing {
public static void main(String[] args) {
Testing testing=new Testing();
testing.reader.start();
testing.writer.start();
}
Thread reader = new Thread("reader") {
public void run() {
System.out.println("reader started");
synchronized (this) {
try {
wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
for (int i = 0; i < 10; i++) {
System.out.println("reader " + i);
}
}
};
Thread writer = new Thread("writer") {
public void run() {
System.out.println("writer started");
for (int i = 0; i < 10; i++) {
System.out.println("writer " + i);
}
synchronized (Thread.currentThread()) {
notifyAll();
}
}
};
}
oui le fil de lecture est retourné tout en appelant thread.But courant ni le notifier et notifier ne réveille pas le fil d'attente. –
oups! C'était une erreur.Je vais corriger cela à l'écrivain.En fait maintenant le fil de discussion actuel est écrivain.Pouvez-vous m'aider à comprendre comment puis-je notifier le fil du lecteur. –
Ne jamais appeler 'wait' sans avoir d'abord confirmé, à l'intérieur du bloc' synchronized', que la chose que vous attendez n'est pas déjà arrivée. Et ne quittez jamais le bloc 'synchronized' après avoir appelé' wait' sans avoir confirmé que la chose que vous attendez est arrivée. (De plus, votre script appelle 'notifyAll' sans avoir rien changé dans le bloc' synchronized', donc il n'y a rien à signaler.) –