Scarica Pd 1617 03 thread 01 parte 2 e più Slide in PDF di Algoritmi E Programmazione Avanzata solo su Docsity!
I Thread in Java Processi e Thread
COME SI GESTISCONO I THREAD IN JAVA
I thread in Java sono oggetti, istanze quindi di una classe
Thread
La evoluzione di Java ha portato a due modalità di
gestione dei thread.
1. istanziare un oggetto thread ogni volta che serve un task
asincrono (creazione e gestione a cura del programmatore).
2. astrarre la gestione, passando un task ad un executor
Noi ci focalizziamo sulla prima modalità, di base.
3: Programmazione concorrente e Thread in Java Programmazione Distribuita I Thread in Java Processi e Thread
DUE MODI PER CREARE E LANCIARE UN THREAD - 1
public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new HelloThread()).start(); } } public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } }
Si deriva una classe
da Thread
Metodo che viene
eseguito quando si
lancia il thread
Metodo main
Si istanzia e si lancia
con start()
Semplice da realizzare
ma con qualche
limitazione
Se HelloThread
deve estendere
un’altra classe?
I Thread in Java Processi e Thread
DUE MODI PER CREARE E LANCIARE UN THREAD - 2
public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new HelloThread()).start(); } } public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } }
Si implementa una
interfaccia
Metodo che viene
eseguito quando si
lancia il thread
Metodo main
L’oggetto istanziato è
passato al costruttore
di Thread e lanciato
Più generale utilizzo
Utilizzabile anche per
l’approccio con
executors
3: Programmazione concorrente e Thread in Java Programmazione Distribuita I Thread in Java Alcuni metodi utili
PLAN
1 Motivazioni alla programmazione concorrente
La tecnologia dei microprocessori
Le sfide
A cosa serve la programmazione concorrente
2 I Thread in Java
Processi e Thread
Alcuni metodi utili
3 I tipi di errori con la programmazione concorrente
Interferenza
Inconsistenza della memoria
I Thread in Java Alcuni metodi utili
GLI INTERRUPT - 2
Un thread che non invoca un metodo che lancia la
eccezione InterruptedException...
... può controllare se è stato interrotto
utilizzando Thread.interrupted()
if (Thread.interrupted()) { throw new InterruptedException(); } // ...
Se è stato ricevuto
(prima) un interrupt
allora si lancia la
eccezione
gestita in una unica
catch() centralizzata
3: Programmazione concorrente e Thread in Java Programmazione Distribuita I Thread in Java Alcuni metodi utili
IL METODO DI join()
A volte è necessario che un thread attenda il
completamento di un altro thread
Se t è un oggetto il cui thread è in esecuzione, allora
t.join() // ...
mette il thread corrente in pausa fino a quando thread t
non termina
Possibile anche specificare un periodo di attesa come
parametro
tempo dipendente dal SO quindi non preciso
join() risponde ad un interrupt generando
InterruptedException
I Thread in Java Mettiamo insieme il tutto...
UN ESEMPIO SimpleThread - 1
Due thread
Il primo thread è il main thread di un programma Java
... che crea un nuovo thread, da un oggetto MessageLoop,
... aspetta il suo termine
Se ci mette troppo, il main thread lo
interrompe con il metodo interrupt()
... ed attende che termini
3: Programmazione concorrente e Thread in Java Programmazione Distribuita I Thread in Java Mettiamo insieme il tutto...
UN ESEMPIO SimpleThread - 2
public class SimpleThreads { static void threadMessage(String msg) { String tn = Thread.currentThread().getName(); System.out.format("%s: %s%n", tn, msg); } private static class MessageLoop implements Runnable { public void run() { String impinf[] = { "Mares eat oats", "Does eat oats", "Little lambs eat ivy", "A kid will eat ivy too" }; try { for (int i = 0; i < impinf.length; i++) { Thread.sleep(4000); threadMessage(impinf[i]); } // end for } catch (InterruptedException e) { threadMessage("I wasn’t done!"); } // end catch } // end run() } // end class MessageLoop // ...
mostra un messaggio
con il nome del thread
stampa formattata
interfaccia
metodo che viene
eseguito allo start del
thread
4 stringhe
blocco try
...catch
pausa di 4 secondi
poi stampa
se interrotta 36/
I Thread in Java Una presentazione in UML degli stati di un thread 39/ 3: Programmazione concorrente e Thread in Java Programmazione Distribuita I tipi di errori con la programmazione concorrente
PLAN
1 Motivazioni alla programmazione concorrente
La tecnologia dei microprocessori
Le sfide
A cosa serve la programmazione concorrente
2 I Thread in Java
Processi e Thread
Alcuni metodi utili
3 I tipi di errori con la programmazione concorrente
Interferenza
Inconsistenza della memoria
I tipi di errori con la programmazione concorrente
COMUNICAZIONE TRA THREAD
I thread comunicano principalmente condividendo accesso
a:
campi (tipi primitivi)
campi che contengono riferimenti a oggetti
Comunicazione molto efficiente (rispetto a usare la rete)
Possibili due tipi di errori:
1 interferenza di thread
2 inconsistenza della memoria
Per risolvere questi problemi, necessaria la sincronizzazione
che a sua volta genera problemi di contesa: quando più
thread cercano di accedere alla stessa risorsa
simultaneamente (deadlock e livelock)
3: Programmazione concorrente e Thread in Java Programmazione Distribuita I tipi di errori con la programmazione concorrente Interferenza
PLAN
1 Motivazioni alla programmazione concorrente
La tecnologia dei microprocessori
Le sfide
A cosa serve la programmazione concorrente
2 I Thread in Java
Processi e Thread
Alcuni metodi utili
3 I tipi di errori con la programmazione concorrente
Interferenza
Inconsistenza della memoria
I tipi di errori con la programmazione concorrente Cosa può andare storto?
L’INTERLEAVING DEI THREAD - 1
3: Programmazione concorrente e Thread in Java Programmazione Distribuita I tipi di errori con la programmazione concorrente Cosa può andare storto?
L’INTERLEAVING DEI THREAD - 2
I tipi di errori con la programmazione concorrente Cosa può andare storto?
IL PROBLEMA DI ACCESSO CONCORRENTE
Race condition: quando il risultato di una operazione
dipende dall’ordine di esecuzione di diversi thread.
Gli errori dovuti ad una race condition sono tipicamente
transienti e difficili da riprodurre (debugging difficile!)
oltre alla transienza e irriproducibilità, l’uso del debugger
può alterare l’ordine di esecuzione dei task
Questi bug vengono anche detti Heisenbug
che richiamano il principio di
indeterminazione di Heisenberg in
fisica quantistica
Principio di Heisenberg
“Non è possibile misurare simultaneamente la posizione ed il
momento (quantità di moto, cioè massa per velocità) di una
particella”
3: Programmazione concorrente e Thread in Java Programmazione Distribuita I tipi di errori con la programmazione concorrente Inconsistenza della memoria
PLAN
1 Motivazioni alla programmazione concorrente
La tecnologia dei microprocessori
Le sfide
A cosa serve la programmazione concorrente
2 I Thread in Java
Processi e Thread
Alcuni metodi utili
3 I tipi di errori con la programmazione concorrente
Interferenza
Inconsistenza della memoria
I tipi di errori con la programmazione concorrente Inconsistenza della memoria
RELAZIONI “HAPPENS-BEFORE”
Come si stabilisce una relazione happens-before? Una
maniera è tramite la sincronizzazione
Due operazioni, che abbiamo descritto, introducono una
relazione happens-before
Thread.start(): gli effetti del codice che ha condotto
alla creazione sono visibili al nuovo thread
Thread.join(): quando la terminazione di un thread A
causa il return della join() di B, tutte le istruzioni di A
sono in happens-before le istruzioni di B che seguono la
join
Una altra maniera è rendere la variabile volatile: una
scrittura a un campo volatile happens-before ogni successiva
lettura della variabile (da parte di qualsiasi thread)
3: Programmazione concorrente e Thread in Java Programmazione Distribuita Conclusioni Cosa abbiamo fatto in questa lezione e i prossimi passi...
CONCLUSIONI
1 Motivazioni alla programmazione concorrente
La tecnologia dei microprocessori
Le sfide
A cosa serve la programmazione concorrente
2 I Thread in Java
Processi e Thread
Alcuni metodi utili
3 I tipi di errori con la programmazione concorrente
Interferenza
Inconsistenza della memoria
Nelle prossime lezioni:
I Ancora sui thread
I Middleware a oggetti distribuiti
I ...