Avevo scritto ieri e ci riprovo, perchè non riesco proprio a trovare l'errore.
Nel mio programma ci sono thread Sensori e thread Utente che provano ad accedere ad un oggetto condiviso e alle sue variabili, quindi utilizzo degli strumenti di sincronizzazione.
Il mio programma va perfettamente fintanto che il numero di thread è minore di 50, ma dai 60 in poi il programma genera un sacco di eccezioni.
implementazione thread Sensor :
https://pastebin.com/e4tk3gN
Implementazione oggetto condiviso Cloud :
https://pastebin.com/2dMWc1U
E' possibile che le eccezioni non siano dovute al codice ma al numero alto di thread che in qualche modo confliggono?
Inoltre il programma parte bene e le eccezioni iniziano dopo la metà dell'esecuzione e sono circoscritte in uno spazio finito, poi il programma riprende normalmente è termina
Ecco una parte delle eccezioni generate :
Exception in thread "Sensore_48" java.lang.IllegalMonitorStateException
[User_1] --> Sto leggendo 4 valori di luminosità nel cloud ... Leggo i valori nel bufferLum in posizione : 0 - 1 - 2 - 3
[Sensore_25] --> Sto scrivendo la temperatura letta nel cloud... Scrivo nel bufferTemp in posizione 28
[Sensore_35] --> Sto misurando la temperatura e la luminosità...
[Sensore_8] --> Sto scrivendo la luminosità letta nel cloud... Scrivo nel bufferLum in posizione 25
[Sensore_0] --> Sto scrivendo la temperatura letta nel cloud... Scrivo nel bufferTemp in posizione 29
at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:149)
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1302)
at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:439)
[Sensore_0] --> Sto scrivendo la luminosità letta nel cloud... Scrivo nel bufferLum in posizione 26
[Sensore_32] --> Sto scrivendo la temperatura letta nel cloud... Scrivo nel bufferTemp in posizione 0
at gestioneinformazioniambientali.Cloud.writeData(Cloud.java:219)
at gestioneinformazioniambientali.Sensor.run(Sensor.java:71)
Exception in thread "Sensore_34" java.lang.IllegalMonitorStateException
[User_1] --> La media dei 4 valori di temperatura letti è : 14.7322
[Sensore_36] --> Sto scrivendo la temperatura letta nel cloud... Scrivo nel bufferTemp in posizione 1
[Sensore_32] --> Sto scrivendo la luminosità letta nel cloud... Scrivo nel bufferLum in posizione 27
at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:149)
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1302)
at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:439)
at gestioneinformazioniambientali.Cloud.writeData(Cloud.java:219)
at gestioneinformazioniambientali.Sensor.run(Sensor.java:71)
[Sensore_31] --> Sto scrivendo la temperatura letta nel cloud... Scrivo nel bufferTemp in posizione 2
Exception in thread "Sensore_35" java.lang.IllegalMonitorStateException
at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:149)
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1302)
at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:439)
at gestioneinformazioniambientali.Cloud.writeData(Cloud.java:219)
at gestioneinformazioniambientali.Sensor.run(Sensor.java:71)
[Sensore_40] --> Sto scrivendo la luminosità letta nel cloud... Scrivo nel bufferLum in posizione 28
[Sensore_23] --> Sto scrivendo la temperatura letta nel cloud... Scrivo nel bufferTemp in posizione 3
[Sensore_27] --> Sto scrivendo la luminosità letta nel cloud... Scrivo nel bufferLum in posizione 29
[Sensore_25] --> Sto scrivendo la luminosità letta nel cloud... Scrivo nel bufferLum in posizione 0
Exception in thread "Sensore_37" java.lang.IllegalMonitorStateException
at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:149)
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1302)
at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:439)
at gestioneinformazioniambientali.Cloud.writeData(Cloud.java:219)