Lab 1: Java Multithreading

Похожие документы
Sistemi Operativi GESTIONE DEI PROCESSI. D. Talia - UNICAL. Sistemi Operativi 4.1

Introduzione al Multithreading

Multithreading in Java I parte. Lorenzo Gallucci

Esercitazione 2: Java Thread. Java Thread. Java Thread. Un thread:

ACSO Programmazione di Sistema e Concorrente

Threads in Java. I threads. Costruttori. Prof.ssa Sara Michelangeli

5 Thread. 5 Thread. 5 Thread. Ad un generico processo, sono associati, in maniera univoca, i seguenti dati e le seguenti informazioni:

Corso di Linguaggi di Programmazione

Telematica II 17. Esercitazione/Laboratorio 6

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

Concorrenza e sincronizzazione

Java thread, concorrenza

Modelli di programmazione parallela

I THREAD O PROCESSI LEGGERI

Esercizio Sincronizzazione Thread

Funzioni, Stack e Visibilità delle Variabili in C

Sistemi Operativi. Gianluca Della Vedova. Sistemi Operativi. Gianluca Della Vedova. Sistemi Operativi. Gianluca Della Vedova.

CLASSIFICAZIONE DEI SISTEMI OPERATIVI (in ordine cronologico)

I Processi. Il Concetto di Processo

Il Sistema Operativo

LABORATORIO di Reti di Calcolatori

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

GESTIONE DEI PROCESSI

I thread. Motivazioni e definizione. Modelli di programmazione multithread. Librerie per i thread. Problemi nella programmazione multithread

LABORATORIO DI SISTEMI OPERATIVI

Sistemi Operativi. Lezione 3 Processi e Thread

Esercitazione [01] Processi e Thread

Транскрипт:

Dept. of Computer Science Lab 1: Java Multithreading Matteo Camilli matteo.camilli@unimi.it Laboratorio di Sistemi Operativi a.a. 2015/16 Università degli Studi di Bergamo 1

Outline Programmazione multithreading I thread in Java Creare e avviare thread in Java Terminazione e cancellazione di thread in Java Esercizi 2

Multitasking Multitasking: task multipli (processi), condividono le medesime risorse computational (CPU). Con un sistema operativo (SO) multitasking, è possibile eseguire contemporaneamente diverse applicazioni. 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. 3

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

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) 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 5

Processo vs Thread Thread 0 Thread 1 Thread n 6

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

Java Thread Ogni programma Java ha almeno un thread corrispondente all esecuzione del metodo main(): 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

Java Thread lifecycle / runnable 9

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

Creare Thread METODO 1 METODO 2 Downloader d = new Downloader(url); d.start(); Thread d = new Thread(new Downloader(url)); d.start(); 11

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

Metodi della classe Thread DOCUMENTAZIONE https://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

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

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

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