Eccezioni dovute all'alto numero di thread?

di Frank2000 il
4 risposte
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)

4 Risposte

  • Perché una altro thread se ne hai già uno? Non è consentito nel forum ...
  • oregon ha scritto:


    Perché una altro thread se ne hai già uno? Non è consentito nel forum ...
    Perchè la discussione di ieri era approssimativa e oggi ho aggiunto particolari...
  • Quindi se aggiungi altri particolari apri un terzo thread?

    I particolari si aggiungono nello stesso thread oppure si fa solo confusione e non si sa a quale thread rispondere.
  • Chiudo questo thread. I particolari vanno aggiunti nel thread originale senza frammentazioni in discussioni differenti
Devi accedere o registrarti per scrivere nel forum
4 risposte