corsoJava
  • Corso JAVA
  • Introduzione linguaggio
  • Verifica tipi primitivi vs reference
  • Esercizi su equals
  • Introduzione su oggetti
  • Packages e import
  • Polimorfismo
    • Pit stop
  • Enum
  • String è speciale
  • Eccezioni
  • Nested Classes
  • Array, ArrayList e Hash Table
    • Esempio gioco carte
  • Linked data structures
  • Tipi generici
  • Comparing Java and C# Generics - Jonathan Pryor's web log
  • Contenitori
    • Esempi con classi container
  • Input/Output streams, Files
  • Basic I/O
  • Java IO Tutorial
  • Networking
  • I Thread e concorrenza
    • Esercizi multithreading
    • Thread interference
    • Esercizi thread interference
    • wait(), notify() e notifyAll() per la sincronizzazione tra i thread
    • Verifiche produttore/consumatore
    • Lock esplicito - java.util.concurrent.Locks
    • Semafori
    • Programmare con i thread
    • I Virtual Thread
    • Materiale
  • I Thread e networking
  • Esempi Java Socket Programming
  • Esempi Javascript Socket Programming
  • Messaggi datagram e invio multicast
  • Lambda Expression
  • Java Stream
  • Data Oriented Programming in Java
  • Java improved its 'Hello World' experience
  • Appendice A: utilizzo classe Scanner
  • Java For The Experienced Beginner
  • Modern Java
  • CodeJava - Java Core
  • Is OOP Relevant Today?
  • Book
Powered by GitBook
On this page
  • Thread per la computazione in background
  • I thread per il multiprocessing
  • Decomposizione dei problemi
  1. I Thread e concorrenza

Programmare con i thread

PreviousSemaforiNextI Virtual Thread

Last updated 2 years ago

Thread per la computazione in background

Il semplice programma è 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.

I thread per il multiprocessing

Decomposizione dei problemi

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.

è 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 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).

MultiprocessingDemo1.java
MultiprocessingDemo1.java
MultiprocessingDemo2.java
BackgroundComputationDemo.java
Insieme di MandelbrotWikipedia
GitHub - checksound/MultiprocessingDemoGitHub
Logo
Logo