violet_prog ha scritto:
La prima cosa (sbagliata) che mi è venuta in mente è dichiarare una variabile volatile, e tramite il controllo di essa interrompere l'esecuzione dei thread quando si è trovata o non trovata la stringa. Ma un attimo dopo mi sono resa conto che questa cosa non poteva essere possibile in quando non posso dichiarare una variabile locale volatile.
Infatti. Una variabile locale non può essere
volatile. Siccome è appunto
locale al metodo, allora NON è condivisa di certo tra thread, quindi
volatile non avrebbe proprio senso.
violet_prog ha scritto:
Cerco qualche consiglio che mi possa aiutare a ragionare per la risoluzione dell'esercizio.
Vediamo intanto di cosa c'è bisogno. Devi gestire due thread, quindi sicuramente dovrai definire due classi che implementano Runnable (tecnicamente si può estendere Thread ma è meno "pulito" dal punto di vista concettuale).
Le due classi Runnable saranno ovviamente diverse, i loro run() dovranno contenere una logica di ricerca differente. Le due classi dovranno avere accesso entrambe all'array e alla stringa. I due thread li useranno solo in lettura (non andranno di certo a modificare l'array).
Questa è solo la prima questione. La seconda è la sincronizzazione. Appena il findString ha creato e avviato i due thread, dovrà mettersi in "attesa" di una risposta dai due thread. Questo vuol dire che all'interno di findString ci deve essere un meccanismo "bloccante" che si sblocca solo quando uno (il primo) dei due thread determina una risposta utile al risultato finale.
Come fare questo meccanismo ... dipende. Dipende se puoi utilizzare costrutti di sincronizzazione di "alto livello" (le classi nel package java.util.concurrent e sotto package) oppure se devi fare "a mano" tu con i wait/notify.
Esiste ancora una terza questione: come terminare i due thread. Se vuoi terminarli prima che essi finiscano "naturalmente" il loro ciclo, allora devi codificare i run() dei due thread in modo che siano "cooperativi" alla terminazione.
Sono riuscito a dare una visione delle problematiche? Ti dico subito che tutto questo è assolutamente fattibile ma non è "banalissimo". Io riuscirei a farlo bene ma mi ci vorrebbe un pochino ... non sono "esercizi" che faccio tutti i giorni ...