Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-01-2014, 18:32   #1
13ciccio87
Member
 
Iscritto dal: Mar 2012
Messaggi: 33
[JAVA] Terminazione Thread

Salve a tutti, ho creato un programma che sfrutta i thread per effettuare una esecuzione ottimizzata di una serie di job.
La struttura del programma è composta da un thread padre che genera altri thread che a loro volta possono generare altri thread.
Dopo aver creato questo bell'albero di thread mi rimane un problema, vorrei sapere quando tutti questi thread terminano e stampare a video che hanno terminato.
Non credo vi sia bisogno di codice, la struttura del programma è molto semplice.
PS: ho provato ad usare anche il pool di thread, ma non riesco a venirne fuori.
Grazie a coloro che mi aiuteranno.
13ciccio87 è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2014, 19:38   #2
mone.java
Senior Member
 
L'Avatar di mone.java
 
Iscritto dal: May 2008
Città: Seattle (WA)
Messaggi: 306
Quote:
Originariamente inviato da 13ciccio87 Guarda i messaggi
Salve a tutti, ho creato un programma che sfrutta i thread per effettuare una esecuzione ottimizzata di una serie di job.
La struttura del programma è composta da un thread padre che genera altri thread che a loro volta possono generare altri thread.
Dopo aver creato questo bell'albero di thread mi rimane un problema, vorrei sapere quando tutti questi thread terminano e stampare a video che hanno terminato.
Non credo vi sia bisogno di codice, la struttura del programma è molto semplice.
PS: ho provato ad usare anche il pool di thread, ma non riesco a venirne fuori.
Grazie a coloro che mi aiuteranno.
Se quello di cui necessiti è aspettare la terminazione di tutti i thread e solo allora stampare a video qualcosa puoi usare la funzione join()... Mettiamo che tu abbia tutti i tuoi Thread dentro a un Array/Lista... Una volta che li hai lanciati tutti fai un for chiamando join su ognuno di essi...
__________________
"Considerate la vostra semenza fatti non foste a viver come bruti ma per seguir virtute e canoscenza"
mone.java è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2014, 20:07   #3
13ciccio87
Member
 
Iscritto dal: Mar 2012
Messaggi: 33
Ti ringrazio per la risposta, ma purtroppo non ho la possibilità di tenere "sott'occhio" tutti i thread.
In sostanza partono autonomamente, e in maniera totalmente sporadica, perchè ogni thread può lanciarne a sua volta degli altri, quindi non ho la possibilità di sapere quanti sono o quindi memorizzarli in un array o lista.
Per come è ora il mio programma avvio i thread e poi l'applicativo termina quando tutti i thread terminano, ma non vorrei che un thread fosse "appesantito" nel tener conto se i thread che ha generato sono attivi.
Potrei provare a creare una classe con un metodo che ogni qualvolta viene creato un thread quest'ultimo viene inserito in un array, ma anche in quel caso non posso sapere se i thread che ho lanciato fino a quel momento sono tutti o ne manca qualcuno. Mi spiego meglio, se i thread che vengono lanciati sono 10 in totale (fra thread principale e sottothread creati dinamicamente) potrei creare man mano la lista che contiene i thread e chiamare su ognuno di essi la join, ma potrei avere che ho listato 7 thread terminati e facendo la join vedo che sono tutti effettivamente terminati, ma i restanti 3 potrebbero partire dopo.
A me servirebbe un modo per far dire ad ogni thread (magari ad un metodo) "avviato" (quando viene creato e avviato) e "ho terminato" (quando termina).
Forse sono un pò contorto nello spiegarmi, ma non saprei fare di meglio.

Edit: ho provato a listare man mano i thread, ma ovviamente ho un errore per modifica concorrente della lista, infatti la lista viene modificata dinamicamente e il for che và a chiamare join su ognuno di essi la tiene occupata finchè non termina il thread, ma intando altri thread cercano di inserirsi, quindi ConcurrentModificationException

Ultima modifica di 13ciccio87 : 25-01-2014 alle 20:22.
13ciccio87 è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2014, 20:44   #4
13ciccio87
Member
 
Iscritto dal: Mar 2012
Messaggi: 33
Mi autorispondo con una soluzione che ho trovato online, ma spero non sia troppo "grezza".
In sostanza, dopo che ho avviato il thread padre scrivo:
Codice:
while(Thread.activeCount() > 1){}
Uso il > 1 perchè il thread Principale (l'applicativo che genera il thread padre è di per sè già un Thread) deve essere ancora in esecuzione.
Così sembra funzionare, dato che ho lancitato una esecuzione controllata avviando 14 thread (totali).
Secondo voi è troppo grezzo? Credo che proverò a fare dei test per vedere se funziona a casaccio o è sempre vero...
13ciccio87 è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2014, 01:52   #5
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
scusate, qual'e la differenza tra un processo e un thread?
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2014, 14:24   #6
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2791
La differenza fondamentale è che uno è parte dell'altro, un processo può essere composto da uno o più thread. Da questo poi derivano altre differenze. Ti consiglio di leggere il paragrafo sull'argomento su wikipedia: http://it.wikipedia.org/wiki/Process...cessi_e_thread
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2014, 08:02   #7
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
@13ciccio87
Quel metodo, oltre ad essere "grezzo", sta li a trasformare la tua CPU in una stufetta.
Prima di tutto devi utilizzare un metodo synchronized per evitare update concorrenti:
http://docs.oracle.com/javase/tutori.../syncmeth.html
Secondo, invece di utilizzare una lista, è sufficiente una variabile intera che viene incrementata per ogni thread avviato e decrementata per ogni thread terminato.
Terzo, utilizza il metodo wait per bloccare l'esecuzione del thread principale, e il metodo notify per sbloccarlo quando il contatore arriva a zero.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2014, 09:46   #8
13ciccio87
Member
 
Iscritto dal: Mar 2012
Messaggi: 33
Grazie, ma hai risposto al secondo post parlando del primo. Il primo punto lo conosco perfettamente, quando eclipse mi ha avvertito che c'era una modifica concorrente sapevo di dover usare un synchronized. Punto secondo avevo già usato il contatore e inutile dirti che arriva a zero anche quando non sono terminati tutti i thread (altrimenti non stavo qua a usare liste e altre cose), infatti, con il contatore avevo trovato una soluzione ottimale, mi bastava chiedere se ogni volta che decrementavo il contatore era arrivato a zero, purtroppo arriva a zero prima che i thread siano terminati tutti. Per terzo è una buona idea, ma la risposta sta nel punto due.

Per ora, la soluzione "grezza" del wihile sembra funzionare alla grande, l'unico problema è che durante il time slice dedicato al thread che contiene il while consumo il tempo di CPU a fare cicli inutili.
Il contatore sarebbe l'idea migliore, ma non riesco a farlo funzionare.
13ciccio87 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2014, 10:04   #9
mone.java
Senior Member
 
L'Avatar di mone.java
 
Iscritto dal: May 2008
Città: Seattle (WA)
Messaggi: 306
Quote:
Originariamente inviato da 13ciccio87 Guarda i messaggi
Punto secondo avevo già usato il contatore e inutile dirti che arriva a zero anche quando non sono terminati tutti i thread (altrimenti non stavo qua a usare liste e altre cose), infatti, con il contatore avevo trovato una soluzione ottimale, mi bastava chiedere se ogni volta che decrementavo il contatore era arrivato a zero, purtroppo arriva a zero prima che i thread siano terminati tutti. Per terzo è una buona idea, ma la risposta sta nel punto due.

Per ora, la soluzione "grezza" del wihile sembra funzionare alla grande, l'unico problema è che durante il time slice dedicato al thread che contiene il while consumo il tempo di CPU a fare cicli inutili.
Il contatore sarebbe l'idea migliore, ma non riesco a farlo funzionare.
Infatti è meglio che tu cerchi una soluzione al contatore globale che sicuramente è la cosa migliore... Per consumare meno CPU nel while puoi metter un Thread.sleep(). Il problema della tua soluzione è che non c'è da fidarsi tanto della "conta globale dei Thread) siccome ne possono essere lanciati altri da altre parti dell'applicazione...Tu dove lo metti l'incremento/decremento dei thread?
__________________
"Considerate la vostra semenza fatti non foste a viver come bruti ma per seguir virtute e canoscenza"
mone.java è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2014, 11:11   #10
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
La soluzione del contatore ti posso assicurare che funziona, l'ho già utilizzata in passato, se a te non va probabilmente non l'hai implementata correttamente.
Il contatore deve essere unico, un buon posto dove dichiararlo sarebbe nella classe dove si trova il thread principale. Nella stessa classe definisci anche i metodi pubblici incrementa e decrementa, in modo da avere una gestione centralizzata. Dichiara il contatore privato e i metodi synchronized pubblici, così sei sicuro che il contatore venga modificato sempre da un unico thread alla volta. Inoltre, se la tua applicazione lo consente, può essere conveniente dichiarare i metodi static (e di conseguenza anche il contatore), in modo da non dover passare ai thread l'istanza sulla quale invocare i metodi.
Ricordati di gestire anche il caso in cui un thread termini inaspettatamente, altrimenti il contatore non arriverà mai a zero.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2014, 11:38   #11
13ciccio87
Member
 
Iscritto dal: Mar 2012
Messaggi: 33
Ovviamente non posso che dare ragione a voi, mi riesco sempre a perdere nelle banalità e poi dico fesserie.
Il contatore lo mettevo nel thread, ma incrementarlo nel thread è sbagliato, perché potrei avere casi in cui un thread non viene avviato in tempo e quindi non incremento il contatore. Mettendo l'incremento nel costruttore del thread (e il decremento prima del break che termina il while(true))ora funziona bene.
La soluzione dell'activeCount non mi piaceva perché avrei contato i thread totali e non quelli che servivano a me (quindi non avrei potuto avviare altri thread).
Purtroppo non posso usare i metodi (e variabili) static perché la classe contiene altri metodi che dovrei far divenire static (riflettero sul farlo o meno, voi dite che conviene più lo static per non portarmi appresso il peso del collegamento alla classe?).
Comunque ora va, ed è questo l'importante.

Ultima modifica di 13ciccio87 : 27-01-2014 alle 12:02.
13ciccio87 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2014, 12:03   #12
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Non c'è bisogno di dichiarare la classe static per avere proprietà e metodi statici, le due cose possono coesistere.

Comunque io l'incremento non lo metterei nel costruttore, perché non è quello il momento in cui il thread parte; lo metterei invece nel metodo run:
Codice:
public void run() {
  try {
    Principale.incrementa();
    //CODICE
  } catch (Throwable e0) {
  } finally {
    Principale.decrementa();
  }
}
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2014, 12:23   #13
13ciccio87
Member
 
Iscritto dal: Mar 2012
Messaggi: 33
Quando dissi che il contatore non funzionava era proprio perché lo mettevo nel run.
13ciccio87 è offline   Rispondi citando il messaggio o parte di esso
Old 27-01-2014, 12:31   #14
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Ah, ho capito cosa intendi, però assicurati di incrementare il contatore dopo la chiamata al metodo start, perché se questo genera un'eccezione ti ritrovi il contatore incrementato senza che il thread venga creato. Nel metodo run metti sempre chatch Throwable e il decremento nel finally, altrimenti in caso di eccezione rischi di non decrementare il contatore.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2014, 23:10   #15
13ciccio87
Member
 
Iscritto dal: Mar 2012
Messaggi: 33
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Ah, ho capito cosa intendi, però assicurati di incrementare il contatore dopo la chiamata al metodo start, perché se questo genera un'eccezione ti ritrovi il contatore incrementato senza che il thread venga creato. Nel metodo run metti sempre chatch Throwable e il decremento nel finally, altrimenti in caso di eccezione rischi di non decrementare il contatore.
Mi scuso per il ritardo nel tornare, ma ci tenevo a ringraziarti, il tuo suggerimento mi è stato molto utile e l'uso dei thread per parallelizzare il tutto ha dato esiti negativi (inizialmente, per questo sono scomparso), ma poi ho trovato il giusto modo per dividere i carichi.
13ciccio87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
Edge AI: NVIDIA Jetson raggiungerà...
La missione robotica LINK per salvare il...
Potrebbe essere stato lanciato l'ultimo ...
PamStealer, il malware per Mac che prima...
NAVEE EXO S Pro, il robot esoscheletro p...
Samsung Galaxy A57 5G a 399€ con 256 GB:...
Volevano collegare delle aragoste vive a...
La crisi dei PC è peggiore del pr...
Alibaba pronta a vietare Claude Code ai ...
Sovranità sui dati: Cloud Firewal...
FiberCop porterà la fibra Gigabit...
Data center in Lombardia: 20 progetti sc...
Tutti i modi in cui la scommessa di Orac...
Kioxia e SanDisk sbandierano i numeri de...
iPhone 18 Pro potrebbe usare modem Qualc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:21.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v