J'essaie de me familiariser avec les threads Java pour le SCJP et j'avais une question.Pourquoi le thread java wait() fonctionne-t-il uniquement avec la limite de temps ici?
Dans le code écrit ci-dessous i simplement créé: deux runnables avec une mémoire de données commune (une matrice) et un procédé d'écriture synchronisée() afin de le remplir avec des données en laissant successivement une lettre en tant que marque pour chaque Exécutable (A et B) en séquence.
Je sais que le code est approximatif et pourrait être mieux écrit mais je cherchais la morale des discussions.
Alors maintenant quand je le lance, il se termine jamais et les résultats à arrêter:
toujours bon. A0. Mais quand je change wait() pour attendre (100) ça marche très bien de 0 à 9 et ça se termine normalement. Quelqu'un pourrait-il expliquer la raison derrière cela pour moi s'il vous plaît?
Merci.
public class ArrayThreads {
Object[] array = new Object[10];
boolean isA = true;
int position = 0;
int getIndex(){
return position;
}
class ThreadA implements Runnable{
synchronized void write(String value){
while(!isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("A");}
}
}
class ThreadB implements Runnable{
synchronized void write(String value){
while(isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("B");}
}
}
public static void main(String[] args){
ArrayThreads threads = new ArrayThreads();
Thread threadA = new Thread(threads.new ThreadA());
Thread threadB = new Thread(threads.new ThreadB());
System.out.println("Still good");
threadB.start();
threadA.start();
}
}