Ciao! ho delle difficoltà a realizzare un metodo che serve nel mio progetto. Il progetto consiste in un insieme di nodi che rappresentano i computer di una rete distribuita. Ogni nodo memorizza a livello locale la memoria che non è altro che un insieme di coppie String valore - int valore.
Ogni volta che per esempio un nodo aggiunge un elemento alla sua memoria, dice agli altri nodi di fare altrettanto, per mantenere tutti la memoria con gli stessi elementi.
La mia difficoltà consiste in questo:
il metodo che devo realizzare è
è richiede questo comportamento: il nodo che esegue questo metodo, controlla se nella sua memoria è presenta la variabile, con quel valore associato. Nel caso non ci sia tale coppia, il metodo va in wait(), bloccandosi fino a che nella memoria non sarà presente quello che cercava.codice:void wait( String variabile , int valore ) throws InterruptedException,
Il metodo l'ho implementato così:
Aggiungo sotto il metodo inserisci() che non so se può tornare utile per capire meglio la situazione:codice:synchronized public void wait(String var, int val) throws InterruptedException { for(int i=0; i<memElements.size(); i++)// scorro la lista { //se almeno uno dei 2 parametri è diverso da ogni elemento nella lista while(memElements.get(i).getVar() != var || memElements.get(i).getVal() != val) { try { wait(); } catch(InterruptedException e) { } } } }
La difficoltà che trovo sta nel fatto che il nodo che va in wait(), quando viene risvegliato da chi fa notifyAll, comunque per come è messo il codice non uscirà mai più dal ciclo while che lo rimette ogni volta in wait. Il fatto è che lui e solo lui può mettere nella sua memoria il nuovo valore comunicatogli da un altro nodo, ma per fare una inserisci() deve prima uscire dal metodo dell'attesa, modificare poi la memoria e quindi ha anche lui un nuovo elemento su cui fare un controllo per vedere se è ciò che cerca e poi eventualmente bloccarsi.codice:synchronized public void inserisci( String variabile, int valore ) { boolean exit = false; for(int i=0; i<memElements.size() && !exit; i++)// scorro la lista { if(memElements.get(i).getVar() == var)// guardo se c'è quella variabile { memElements.get(i).setVal(val);// se c'è, imposto il nuovo valore notifyAll();//per chi è in Wait exit = true;// posso uscire dal ciclo } } if(!exit)//se non c'è già, exit è false { memElements.addFirst(new Element(var,val));// metto in testa il nuovo elemento notifyAll();//per chi è in Wait } }
Non ho idea di come implementare questo metodo, mi sapete dare qualche consiglio?
Grazie mille
![]()

Rispondi quotando
