/ / new to multithreading - comment utiliser wait () et notify () en java? - java, multithreading, attendre, notifier

nouveau sur le multithreading, comment utiliser wait () et notify () en java? - java, multithreading, attendre, notifier

J'essaie d'écrire un programme avec 2 classes, uncontrôleur et une classe qui fait beaucoup de calcul. Le contrôleur crée quelques instances de l'autre classe, puis leur dit à tous de commencer leurs calculs (en parallèle). Ils reviennent chaque fois qu'ils ont terminé et le contrôleur reprend, puis, quelque temps plus tard, le contrôleur leur transmet de nouvelles données et leur demande de relancer le calcul.
Idéalement, je pourrais appeler start () avecparamètres, mais ce n’est pas possible, donc le contrôleur appelle une méthode dans la calculatrice qui stocke les données dans un fichier global, puis démarre le fil de calcul et revient, ce qui fonctionne jusqu’à ce que j’essaie de redémarrer le fil et me dit le thread est mort. J'essaie donc de faire en sorte que le cycle soit une boucle infinie qui attend juste d’être averti, exécute les calculs, stocke les résultats dans un fichier global afin que le contrôleur puisse les récupérer plus tard, puis reprend son attente. Donc, quelque chose comme:

//in controller:
Calculator calc=new Calculator();
calc.runCalculations(data);
while(calc.isCalculating()){
//do nothing
}
System.out.println("results: "+calc.getAnswer());
calc.runCalculations(data2);

//in calculator:
public runCalculations(Data data){
globalData=data;
this.notify();
}
public void run(){
while(true){
synchronized(this){
wait();
}
calculating=true;
globalData=calculate(globalData);
calculating=false;
}
}

Réponses:

4 pour la réponse № 1

Vous devez obtenir le moniteur sur this avant d'appeler notify(). Aussi, quand vous appelez wait() vous devez le faire dans une boucle qui vérifie une condition pour vous assurer de ne pas avoir été réveillé de façon fausse.

public runCalculations(Data data){
globalData=data;
synchronized(this) {
calculating=true;
this.notify();
}
}
public void run(){
while(true){
synchronized(this){
calculating=false;
while(!calculating) {
wait();
}
}
globalData=calculate(globalData);
}
}

En général, la plupart des gens déconseillentutilisez wait / notify et recommandez plutôt d'utiliser un exécuteur ou au moins une BlockingQueue. Mais dans les deux cas, vous devrez redéfinir ce que vous pensez actuellement.