Yves ha scritto:
Ho una lista di oggetti di lunghezza n e devo creare una funzione che per ogni oggetto della lista mi crea un thread con lo scopo di fare la wait su quell'oggetto. Ovviamente poi devo fare anche la funzione che mi sveglia tutti gli oggetti, ma quella è più semplice.
Quindi cosa ho pensato: faccio un ciclo for( Object i : lista) cosi prendo l'object i della lista, poi creo un nuovo thread all'interno del ciclo che fa i.wait(). Solo che non procede con tutti gli altri oggetti della lista la mia funzione.
Per iniziare, è necessario chiarire alcune cose: innanzitutto per poter invocare wait()/notify()/notifyAll() su un oggetto è obbligatorio acquisire prima il
monitor ("lock") di quell'oggetto, ovvero, è necessario usare la parola chiave
synchronized.
Il wait() comunque di norma NON lo si fa così direttamente al volo e basta. Il wait() tipicamente si mette in un ciclo (solitamente un while() ) che deve testare la condizione che deve "reggere" affinché il thread vada e resti in sospensione.
Faccio sempre l'esempio della coda "bloccante" (perché abbastanza chiaro/ovvio), dove se la coda è vuota, il thread che fa un estrai()
deve stare in wait. Quindi nel estrai() si farà una cosa tipo:
while (_condizione_coda_vuota_) {
wait();
}
Ci sono vari motivi, storici e pratici per questo approccio con il while, che non sto ora a descrivere meglio per brevità.
Quindi il tuo caso d'uso sicuramente non calza molto bene il modo tipico di utilizzo del wait().
Ma il wait() diretto (cioè senza test/cicli) comunque lo puoi fare, potrebbe non essere un problema. E probabilmente nel tuo caso d'uso può anche funzionare come ti aspetti.
Comunque, per creare un thread devi estendere Thread o implementare Runnable. In entrambi i casi, farai un costruttore che riceve l'oggetto che poi mantieni come variabile di istanza nel TuoRunnable (o TuoThread, non importa). Quindi nel run() potrai usare l'oggetto.
Da quanto hai detto, purtroppo non è molto chiaro il problema o dubbio. Se quanto ho detto non ha chiarito, precisa meglio i tuoi dubbi e magari posta anche il codice.