andbin ha scritto:
tagan ha scritto:
Mi va in errore
java.lang.IllegalMonitorStateException
Sì, perché i wait/notify/notifyAll si devono invocare su di un oggetto di cui il thread corrente ha acquisito il lock.
Capito.
funziona tutto facendo questa modifica. i metodi che hanno
wait() e
notifyAll() vengono chiamati da Thread.
in questo modo no ho più l'errore
IllegalMonitorStateException
in pratica ho il metodo run in questo modo
@Override
public void run(){
TorreDiControllo.getInstance().controlliPreVolo(this); <<<----- wait(X) ...per fermare il thread per X secondi ma non bloccare la risorsa
Pista p = TorreDiControllo.getInstance().acquisciPista(this); <<<----- wait() fino al notify, se non ci sono piste disponibili e remove()
TorreDiControllo.getInstance().decolla(this); <<<----- sleep(Y) ...per bloccare la risorsa per Y secondi
TorreDiControllo.getInstance().rilasciaPista(p); <<<----- notifyAll() per liberare i thread e rimettere la pista nell'ArrayList
}
dove è il problema? .......se è un problema:
come puoi vedere, il Thread 3 - Aereo 4 impiega 10 secondi a decollare, in questo tempo, tutti gli altri thread avrebbero dovuto terminare i controlli e stampare "TERMINATI i controlli", invece lo fanno dopo il "decollo" di Aereo 4, come se questo Thread, bloccasse tutto anche le altre risorse.
Ti posto il risultato
Thread-0 - Aereo 1 sta FACENDO i controlli in 8 secondi
Thread-3 - Aereo 4 sta FACENDO i controlli in 2 secondi
Thread-1 - Aereo 2 sta FACENDO i controlli in 5 secondi
Thread-4 - Aereo 5 sta FACENDO i controlli in 8 secondi
Thread-5 - Aereo 6 sta FACENDO i controlli in 6 secondi
Thread-6 - Aereo 7 sta FACENDO i controlli in 6 secondi
Thread-7 - Aereo 8 sta FACENDO i controlli in 3 secondi
Thread-9 - Aereo 10 sta FACENDO i controlli in 3 secondi
Thread-8 - Aereo 9 sta FACENDO i controlli in 2 secondi
Thread-2 - Aereo 3 sta FACENDO i controlli in 6 secondi
Thread-3 - Aereo 4 ha TERMINATO i controlli
Thread-3 - Aereo 4 sta decollando su Pista 2. impiega 10 secondi!
Thread-3 - Aereo 4 è decollato da Pista 2. Pista libera!
Thread-4 - Aereo 5 ha TERMINATO i controlli
Thread-4 - Aereo 5 sta decollando su Pista 1. impiega 1 secondi!
Thread-4 - Aereo 5 è decollato da Pista 1. Pista libera!
Thread-0 - Aereo 1 ha TERMINATO i controlli
Thread-0 - Aereo 1 sta decollando su Pista 0. impiega 10 secondi!
Thread-0 - Aereo 1 è decollato da Pista 0. Pista libera!
Thread-5 - Aereo 6 ha TERMINATO i controlli
Thread-5 - Aereo 6 sta decollando su Pista 0. impiega 1 secondi!
Thread-5 - Aereo 6 è decollato da Pista 0. Pista libera!
Thread-6 - Aereo 7 ha TERMINATO i controlli
Thread-6 - Aereo 7 sta decollando su Pista 0. impiega 8 secondi!
Thread-6 - Aereo 7 è decollato da Pista 0. Pista libera!
Thread-2 - Aereo 3 ha TERMINATO i controlli
Thread-2 - Aereo 3 sta decollando su Pista 0. impiega 3 secondi!
Thread-2 - Aereo 3 è decollato da Pista 0. Pista libera!
Thread-1 - Aereo 2 ha TERMINATO i controlli
Thread-9 - Aereo 10 ha TERMINATO i controlli
Thread-7 - Aereo 8 ha TERMINATO i controlli
Thread-8 - Aereo 9 ha TERMINATO i controlli
Thread-8 - Aereo 9 sta decollando su Pista 2. impiega 4 secondi!
Thread-8 - Aereo 9 è decollato da Pista 2. Pista libera!
Thread-7 - Aereo 8 sta decollando su Pista 1. impiega 9 secondi!
Thread-7 - Aereo 8 è decollato da Pista 1. Pista libera!
Thread-9 - Aereo 10 sta decollando su Pista 1. impiega 8 secondi!
Thread-9 - Aereo 10 è decollato da Pista 1. Pista libera!
Thread-1 - Aereo 2 sta decollando su Pista 0. impiega 8 secondi!
Thread-1 - Aereo 2 è decollato da Pista 0. Pista libera!
Come si vede nei "CONTROLLI", Aereo 4 e Aereo 9 avrebbero dovuto terminare i controlli dopo soli 2 secondi, invece il 4 ha terminato in 2 secondi, mentre il 9 dopo circa 20 secondi.
Questo è dovuto al fatto che il wait o lo sleep mettono a dormire tutto e il notifyAll risveglia i Thread che cercano di rimpossessarsi delle risorse, ma il primo che arriva riblocca tutto? .....il 9 è solo stato sfortunato insomma!
ho provato a usare i secondi (da 1 a 10) nel setPriority(), ma sembra non sunzionare!
Cmq, diciamo che la concorrenza l'ho gestita questo è l'importante, il resto è solo essere pignoli...!
Come sempre grazie dei consigli e correzioni.
Tagan