Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java...

16
Lab 1: Java Multithreading Matteo Camilli [email protected] 1 Dept. of Computer Science Laboratorio di Sistemi Operativi a.a. 2015/16 Università degli Studi di Bergamo

Transcript of Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java...

Page 1: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Lab 1: Java Multithreading

Matteo Camilli

[email protected]

1

Dept. of Computer Science

Laboratorio di Sistemi Operativi a.a. 2015/16Università degli Studi di Bergamo

Page 2: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Outline

• Programmazione multithreading• I thread in Java

• Creare e avviare thread in Java• Terminazione e cancellazione di thread in Java

• Esercizi

2

Page 3: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Multitasking

• Multitasking: task multipli (processi), condividono le medesime risorse computational (CPU). Con un sistema operativo (SO) multitasking, è possibile eseguire contemporaneamente diverse applicazioni.

3

• Single core CPU: solamente un’unico processo alla volta è in esecuzione. Lo scheduler del SO sceglie, per ogni istante di tempo, quale dei processi in coda viene eseguito.

• Multicore CPU: Quando ci sono a disposizione più unità computazionali, un SO multicore può eseguire più processi in modo concorrente. I core lavorano indipendentemente su diversi processi.

Page 4: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Multithreading

• Multithreading: Multithreading estende l’idea del multitasking a livello di processo, in modo da poter suddividere specifiche operazioni di una singola applicazione in thread separati. Ogni thread può essere eseguito in parallelo. Il SO divide il tempo di processamento non solo tra diversi processi, ma anche tra diversi thread di ogni processo.

4

Page 5: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Processo vs Thread

• PROCESSO: Programma in esecuzione• è autonomo e indipendente dagli altri processi• ha un proprio spazio di indirizzamento riservato (porzione di memoria RAM) e non condivide

memoria con altri processi (anche le variabili globali sono private al processo)• ha un proprio stack riservato (quindi anche le variabili locali sono private al processo)• La comunicazione tra processi distinti non può quindi avvenire in modo “diretto” (per

condivisione di variabili), ma deve sfruttare appositi meccanismi (es., file o socket)

5

• THREAD: Attività autonoma che “vive” all’interno di un processo• Non è indipendente, è un sotto-flusso di esecuzione concorrente di un determinato processo• non ha uno spazio di indirizzamento riservato: tutti i thread appartenenti allo stesso

processo condividono il medesimo spazio di indirizzamento• La a comunicazione fra thread può avvenire tramite lo spazio di memoria condiviso (variabili

globali condivise)• Occorre però disciplinare l’accesso alla memoria condivisa -> necessità di opportuni

meccanismi di sincronizzazione

Page 6: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Processo vs Thread

6

Thread 0 Thread 1 Thread n…

Page 7: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Concorrenza

• DEFINIZIONE: Esecuzione di “task” multipli nello “stesso” tempo

• PROGRAMMA SEQUENZIALE• per ogni esecuzione sulla medesima macchina produce sempre lo stesso output, eseguendo

sempre la medesima sequenza di istruzioni• esecuzione DETERMINISTICA

7

• PROGRAMMA CONCORRENTE• ogni task corrisponde ad un flusso di esecuzione eseguito in parallelo• nonostante abbiano lo stesso input, un programma concorrente può esibire comportamenti

differenti su diverse esecuzioni• esecuzione NON DETERMINISTICA

Page 8: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Java Thread

• Ogni programma Java ha almeno un thread corrispondente all’esecuzione del metodomain(): main thread

• Qualsiasi processo Java è multithread:• Il garbage-collector è gestito da un thread separato

• La gestione dei thread in Java dipende dalla specifica Java Virtual Machine (JVM) usata• Green (user level) threads: vengono schedulati dalla JVM invece che dal sottostante SO. I

green threads emulano ambienti multithreading anche in SO che non lo supportano. Sono gestiti in user-space invece che kernel-space.

• Native threads (da Java 1.3): vengono gestiti dallo scheduler del SO in kernel-space.

8

Page 9: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Java Thread lifecycle

9

/ runnable

Page 10: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

java.lang.Thread

• E’ possibile “creare” dei thread in Java estendendo la classe java.lang.Thread• I thread vengono effettivamente creati dalla JVM quando viene invocato il metodo:start()

10

Page 11: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Creare Thread

11

• Downloader d = new Downloader(url);• d.start();

METODO 1

• Thread d = new Thread(new Downloader(url));• d.start();

METODO 2

Page 12: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Creare Thread

• Parametri durante la creazione di un Thread:• Runnable target -> Oggetto che implementa il metodo run()• String threadName -> Nome che diamo al thread

• ThreadGroup group -> Gruppo di cui il thread creato fa parte

12

Page 13: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Metodi della classe Thread

• DOCUMENTAZIONEhttps://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html

• Esempi:• getName(), setName(String s)

per ottenere e settare, rispettivamente, il nome di un thread• Thread.sleep(int ms)

consente di bloccare il thread corrente per il numero specificato di millisecondi• Thread.currentThread()

restituisce il riferimentodel thread attualmente in esecuzi• join()

invocando il metodo join su un oggetto thread, il thread corrente si blocca fino alla terminazione del thread associato a tale oggetto

13

Page 14: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Interruzione di un Thread

• I thread terminano la propria esecuzione quando l’esecuzione del metodo run() finisce

• E’ possibile invocare il metodo interrupt() su un oggetto Thread

• Un interrupt è un segnale inviato ad un thread il quale dovrebbe interrompere ciò che sta facendo e reagire al segnale.

• E’ il programmatore che definisce come il thread reagisce ad un interrupt (e’ molto comune reagire terminando l’esecuzione).

14

Page 15: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Esercizi

• Concorrenza piattaforma ospitante: Creare un’applicazione con due thread figli. Ciascuno dei due thread ha associato un simbolo (ad es. * o #). Sovrascrivere il metodo run() in modo che ciascun thread stampa continuamente su stdout il proprio simbolo, andando a capo ogni 50 simboli stampati.

• Non determinismo: creare un’applicazione Java contenente 3 thread come segue. Un thread principale corrispondente al metodo main() che stampa il suo nome, e poi crea ed avvia due thread dello stesso tipo: un thread di nome “A” e un thread di nome “B”. Il comportamento dei thread consiste nell’attendere 1 secondo e stampare su stdout il proprio nome. Provare ad eseguire l’applicazione più volte, e a comprendere cosa succede.

• Interrupt: creare un’applicazione Java contenente 3 thread. Un thread principale main(), che crea ed avvia due altri thread, e dopo avere atteso qualche secondo invia un interrupt() ad entrambi i thread lanciati. Il primo thread deve ricevere il segnale mentre è bloccato in sleep. Il secondo thread riceve il segnale mentre è in running. Entrambi i thread dopo avere ricevuto il segnale stampano su stdout un messaggio opportuno e poi terminano l’esecuzione.

• Somma parallela: Scrivere un programma multithread in Java che dato un array di 50 valori numerici ne esegue la somma in modo parallelo. Creare 5 thread e assegnare ad ogni thread una partizione dell’array (10 valori). Ogni thread esegue la somma dei propri valori e mettere il risultato in una struttura dati del thread main contenente i risultati parziali. Il thread main deve sincronizzarsi sulla terminazione (join) dei thread figli dopodiché somma i risultati parziali e li stampa su stdout.

15

Page 16: Lab 1: Java Multithreadingcamilli.di.unimi.it/so-lab/lab1.pdf · 2016. 4. 7. · Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it 1 Dept. of Computer Science Laboratorio

Esercizi (2)

• Somma parallela (Thread Pool):Svolgere l’esercizio precedente utilizzando un thread pool:final ExecutorService pool = Executors.newFixedThreadPool(5);I Thread che eseguono la somma in parallelo devono implementare l’interfaccia:Callable<V> Il main thread accumula i risultati parziali in una lista di oggetti di tipo:Future<V>La somma totale viene stampata su stdout.

16