Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Pd 1617 03 thread 01 parte 2, Slide di Algoritmi E Programmazione Avanzata

thread - thread

Tipologia: Slide

2015/2016

Caricato il 22/10/2016

valerio64
valerio64 🇮🇹

1 documento

1 / 13

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
3: Programmazione concorrente e Thread in Java Programmazione Distribuita
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.
27/52
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?
28/52
pf3
pf4
pf5
pf8
pf9
pfa
pfd

Anteprima parziale del testo

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