Programmare con i thread
Last updated
Last updated
Il semplice programma BackgroundComputationDemo.java è un esempio di background processing. Questo programma crea un'immagine che ci vuole un po' per essere calcolata perché per disegnarla bisogna svolgere alcuni calcoli per calcolare il colore di ogni pixel dell'immagine. L'immagine stessa è un esempio di un oggetto matematico conosciuto come insieme di Manbelbrot.
MultiprocessingDemo1.java è una variazione di BackgroundComputationDemo. Invece di fare la computazione in un singolo thread, MultiprocessingDemo1 può dividere il problema tra diversi thread. L'utente può selezionare il numero dei thread da utilizzare. A ogni thread è assegnata una sezione dell'immagine da calcolare. I thread eseguono le operazioni in parallelo. Per esempio, se ci sono due thread, il primo computa la metà superiore dell'immagine mentre il secondo thread calcola la parte inferiore. Qui una figura del programma verso la fine dell'esecuzione utilizzando tre thread. Le aree grigie rappresentano parti dell'immagine che non è ancora stata calcolata:
Il programma MultiprocessingDemo1.java divide il compito di computare l'immagine in diversi sottocompiti e assegna ogni sottocompito a un thread. Sebbene questo funzioni, c'è un problema: Alcuni dei sottocompiti potrebbero durare sostanzialmente di più che altri. Il programma divide l'immagine in parti uguali, ma alcune parti dell'immagine richiedono più calcoli di altre. In effetti, se facciamo eseguire il programma con tre thread, noterai che il pezzo in mezzo sarà più lungo da essere calcolato che le due parti sopra e sotto. In generale, quando dividiamo un problema in sottoproblemi, è molto difficile predire quanto tempo sarà necessario per completare ogni sottoproblema. Supponiamo che un particolare sottoproblema abbia bisogno di molto più tempo per essere completato che gli altri. Il thread che computa il sottoproblema continuerà l'esecuzione per un tempo relativamente lungo dopo che gli tutti gli altri thread hanno completato. Durante questo tempo, solo uno dei processori del computer sarà impegnato, gli altri saranno inattivi (idle).
Come semplice esempio, supponiamo che il tuo computer abbia due processore. Noi dividiamo il problema in due sottoproblemi e creiamo un thread che esegua ogni sottoproblema. Si potrebbe sperare che utilizzando entrambi i processori, si dovrebbe ottenere la risposta in metà del tempo che si potrebbe avere con l'utilizzo di un solo processore. Ma se un sotto problema impiega quattro volte di più dell'altro per completare, allora per la maggior parte del tempo solo un processore starà lavorando. In questo caso, avremo un taglio solo del 20% del tempo per ottenere la risposta.