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

Documenti analoghi
Esercitazione 2: Java Thread

Java Thread. Thread. Un thread

THREAD IN JAVA. Thread. Un thread (lightweight process) è un singolo flusso sequenziale di controllo all interno di un processo

Thread in Java. Thread = flusso di esecuzione indipendente nel codice del programma

Programmazione concorrente con il linguaggio Java

I Thread. un thread è uno stream di esecuzione del programma

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

Java thread, concorrenza

THREAD. Programmazione in rete e laboratorio. Come si crea un thread

Concorrenza e sincronizzazione

Multithreading. Multithreading/2

SISTEMI OPERATIVI. Sincronizzazione in Java (Java object lock e segnali wait-notify-notifyall)

Programmazione concorrente in Java

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

T 1. Per un processo con più thread di controllo, lo stato di avanzamento della computazione di ogni thread è dato da:

Multithreading in Java. Fondamenti di Sistemi Informativi

I thread di uno stesso processo condividono dati e codice del processo, ma lo stack di esecuzione ed il program counter sono privati.

I Thread in Java. Sistemi Operativi L-A. I threads in Java

Gestione dei thread in Java LSO 2008

Multithreading in Java I parte. Lorenzo Gallucci

Java Threads. esempi

Thread THREAD IN JAVA. Un thread (lightweight process) è un singolo flusso sequenziale di controllo all interno di un processo

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A lezione 14 - Thread in Java

Lab 1: Java Multithreading

Java Virtual Machine

Definizione di thread Proprietà dei thread in Java Gestione delle priorità nei programmi multithreaded Gruppi di thread Accesso a variabili condivise

GESTIONE DEI PROCESSI

Multi-threading. I programmi Java possono eseguire thread multipli in modalità di concorrenza logica. Come funziona il multi-threading?

Processi e Thread. Walter Cazzola Dipartimento di Informatica e Comunicazione Università à degli Studi di Milano.

Laboratorio Reti di Calcolatori Laurea Triennale in Comunicazione Digitale. Anno Accademico 2012/2013

Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002. Sistemi Operativi Corsi A e B. Esercitazioni 7 e 8

Gruppi di Thread. Java threads (3) Gruppi di thread e Timer. Operating Systems. Operating Systems. Java threads 3. Java threads 3

Java threads (2) Programmazione Concorrente

Corso di Linguaggi di Programmazione

Programmazione Orientata agli Oggetti in Linguaggio Java

Esercitazione 15. Il problema dello Sleeping Barber

Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread

19. Introduzione al multi-threading

Thread e Task. L20_MultiThread 2

THREAD IN JAVA. Come si può realizzare il concetto di Thread in Java?

Sincronizzazione con Java

Con il pulsante Start si introducono palline che rimbalzano in un area di disegno fino a che non è terminato il loro ciclo di vita (1000 movimenti).

Programmazione Concorrente in Java

Esercitazione maggio 2011

Lezione n.6 LPR A - INFORMATICA THREADS:, SINCRONIZZAZIONE ESPLICITA

Programmazione a oggetti

Laboratorio di Sistemi Thread Java

Multithreading in Java IS-8 1

Esercizio monitor. Sistemi Operativi T 1

Esercizi sugli Oggetti Monitor

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Programmazione concorrente e threads

Un programma concorrente è un programma nel quale diverse computazioni possono essere eseguite allo stesso tempo Alcuni sistemi sono implicitamente

Multithreading in Java

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione concorrente in Java. Dr. Paolo Casoto, Ph.D

PROGRAMMAZIONE 2 5. Dynamic dispatch

Sistemi Operativi e Laboratorio, Prova del 6/4/2017 versione A

Introduzione al Multithreading

il tipo di parallelismo dipende dal grado di cooperazione

Telematica II 17. Esercitazione/Laboratorio 6

Compute engine generici in RMI

I costruttori. Il costruttore standard. Esempio di valori di default. Alterare il costruttore standard

Informatica Generale 07 - Sistemi Operativi:Gestione dei processi

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

JAVA Gestione delle eccezioni e Programmazione concorrente

Il problema è trovare un modo nel quale gli eventi dell oggetto di riferimento, siano comunicati a tutti gli altri interessati.

Esercitazioni Ingegneria del So2ware 8 Threads. Giordano Tamburrelli tamburrelli@elet.polimi.it h@p://giordano.webfacdonal.com

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Esercitazioni 7 e 8. Bounded Buffer con sincronizzazione Java (1)

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Informatica 3 secondo recupero 13 Settembre 2002

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java

Compute engine generici in RMI

Programmazione multi threaded in Python. Linguaggi dinamici A.A. 2010/2011 1

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

progam ponteasensounicoalaternato ; type dir = ( nord, sud );

Esempio: Costruttori ed ereditarietà

Esercizio sul Monitor in Java. 18 maggio 2011

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Uguaglianza e copia di oggetti

ACSO Programmazione di Sistema e Concorrente

Thread in Java CAPITOLO Richiami di gestione di processi

Metodi. Un metodo è una porzione di codice a cui si associa un nome. Un istruzione eseguita da un metodo può essere:

Esercizi RMI. Laboratorio di Programmazione di Rete A 5/12/2007. Esercitazione di Laboratorio

Lab 4: Locks, Condition Variables in Java

Corso di Reti di Calcolatori L-A

Ingegneria del Software

Lezione 15 Programmazione multithreaded

PROCESSI ESEMPIO THREAD. RETI DI CALCOLATORI Linguaggio Java: i Thread CORSO DI. Università degli Studi di Modena e Reggio Emilia

Esempi in Java di program.ne O-O

Un esercizio d esame. Flavio De Paoli

Supporto al Sistema Operativo

Corso di Programmazione Concorrente. Java Thread. Valter Crescenzi

Esercizi sul Monitor in Java. 22 Maggio 2015

Il linguaggio Java. La superclasse universale Object

Transcript:

Esercitazione 2: Thread Un thread è un singolo flusso sequenziale di controllo all interno di un processo Un thread (o processo leggero) è un unità di esecuzione che condivide codice e dati con altri thread ad esso associati Un thread: NON ha uno spazio di indirizzamento riservato: tutti i thread appartenenti allo stesso processo condividono lo stesso spazio di indirizzamento ha execution stack e program counter privati Sistemi Operativi L-A 2 Due modalità per implementare i thread in Java: 1. estendendo la classe Thread 2. implementando l interfaccia Runnable 1) Come sottoclasse di Thread la sottoclasse deve ridefinire il metodo run() si crea un istanza del thread tramite new si esegue un thread invocando il metodo start() che a sua volta invoca il metodo run() public class SimpleThread extends Thread{ public SimpleThread(String str) {super(str); public static void main(string[] args) { SimpleThread st1=new SimpleThread("Thread 1"); st1.start(); Sistemi Operativi L-A 3 Sistemi Operativi L-A 4

public void run() { for(int i=0; i<10; i++) { System.out.println(i+ " " +getname()); try{ sleep((int)math.random()*1000); catch (InterruptedException e){ System.out.println("DONE! "+getname()); Sistemi Operativi L-A 5 E se occorre definire thread che estendano una classe diversa da Thread? Come classe che implementa interfaccia Runnable 1. la sottoclasse deve ridefinire il metodo run() 2. si crea un istanza di tale sottoclasse tramite new 3. si crea un istanza della classe Thread con new, passandole come parametro l oggetto che implementa Runnable 4. si esegue il thread invocando il metodo start() sull oggetto con classe Thread creato Sistemi Operativi L-A 6 class EsempioRunnable extends MiaClasse implements Runnable { public void run() { for (int i=1; i<=10; i++) System.out.println(i + + i*i); Processo Var locali metodi (Stack1) T1 int x 3 obj o1 obj o2 Thread Codice Var Static Heap T2 int x 192 obj o1 obj o2 Var locali metodi (StackN) public class Esempio { public static void main(string args[]){ EsempioRunnable e = new EsempioRunnable(); Thread t = new Thread (e); t.start(); PC1 Thread 1 Var locali metodi (Stack2) PC2 Thread 2 PCN Thread N Sistemi Operativi L-A 7 Sistemi Operativi L-A 8

Interferenza public class SharingThread extends Thread { private int cond=3; private SharedObject obj=new SharedObject(); public SharingThread (String my_name, int x, SharedObject obj){ super(my_name); this.cond=x; this.obj=obj; public static void main(string[] args){ int val=128; SharedObject obj=new SharedObject(); Interferenza SharingThread st1= new SharingThread ("Thread 1", val, obj); SharingThread st2= new SharingThread ("Thread 2", val, obj); st1.start(); st2.start(); public void run(){ if(getname().equals("thread 1")){ cond=1; obj.setval(1); if(getname().equals("thread 2")){ cond=2; obj.setval(2); Sistemi Operativi L-A 9 Sistemi Operativi L-A 10 New Thread Ciclo di vita di un thread Subito dopo l istruzione new Il costruttore alloca e inizializza le variabili di istanza Runnable Il thread è eseguibile ma potrebbe non essere in esecuzione Sistemi Operativi L-A 11 Not Runnable Ciclo di vita di un thread Il thread non può essere messo in esecuzione Entra in questo stato quando è in attesa della terminazione di un operazione di I/O, cerca di accedere ad un metodo synchronized di un oggetto bloccato, o dopo aver invocato uno dei seguenti metodi: sleep(), wait(), suspend() Esce da questo stato quando si verifica la condizione complementare Dead Il thread giunge a questo stato per morte naturale o perché un altro thread ha invocato il suo metodo stop() Sistemi Operativi L-A 12

Sincronizzazione di thread Differenti thread condividono lo stesso spazio di memoria (heap) è possibile che più thread accedano contemporaneamente ad uno stesso oggetto, invocando un metodo che modifica lo stato dell oggetto lo stato finale dell oggetto sarà funzione dell ordine in base al quale i thread accedono ai dati Servono meccanismi di sincronizzazione Accesso esclusivo Per evitare che thread diversi interferiscano durante l accesso ad oggetti condivisi si possono imporre accessi esclusivi JVM supporta la definizione di lock sui singoli oggetti tramite la keyword synchronized Synchronized può essere definita: su metodo su singolo blocco di codice Sistemi Operativi L-A 13 Sistemi Operativi L-A 14 In pratica: Synchronized Ad ogni oggetto Java è automaticamente associato un lock Quando un thread vuole accedere ad un metodo/blocco synchronized, si deve acquisire il lock dell oggetto (impedendo così l accesso ad ogni altro thread) Il lock viene automaticamente rilasciato quando il thread esce dal metodo/blocco synchronized (o se viene interrotto da un eccezione) Un thread che non riesce ad acquisire un lock rimane sospeso sulla richiesta della risorsa fino a che il lock non è disponibile Synchronized Ad ogni oggetto viene assegnato un solo lock: due thread non possono accedere contemporaneamente a due metodi/blocchi synchronized diversi di uno stesso oggetto Tuttavia altri thread sono liberi di accedere a metodi/blocchi non synchronized associati allo stesso oggetto Sistemi Operativi L-A 15 Sistemi Operativi L-A 16

Esempio uso di synchronized Sincronizzazione public class MyThread extends Thread{ private SharedObject obj;... public void run(){ obj.incr(100); public class SharedObject { int val=0; public int synchronized incr (int amount) { Esistono situazioni in cui non è sufficiente impedire accessi concorrenti Supponiamo che un metodo synchronized sia l unico modo per variare lo stato di un oggetto val = val + amount; return val; Che cosa accade se il thread che ha acquisito il lock si blocca all interno del metodo stesso in attesa di un cambiamento dello stato? Sistemi Operativi L-A 17 Sistemi Operativi L-A 18 wait() notifyall() wait()- il thread che la invoca si blocca in attesa che un altro thread invochi notify() o notifyall() per quell oggetto deve essere in possesso del lock sull oggetto al momento della invocazione rilascia il lock notify() - il thread che la invoca risveglia uno dei thread in attesa, scelto arbitrariamente notifyall() - il thread che la invoca risveglia tutti i thread in attesa: essi competeranno per l accesso all oggetto notifyall() è preferibile (e può essere necessaria) se più thread possono essere in attesa Sistemi Operativi L-A 19 Sistemi Operativi L-A 20

Alcune regole empiriche Esempio produttori-consumatori 1. Se due o più thread possono modificare lo stato di un oggetto, è necessario dichiarare synchronized metodi di accesso 2. Se deve attendere la variazione dello stato di un oggetto, un thread deve invocare il metodo wait() 3. Ogni volta che un metodo attua una variazione dello stato di un oggetto, esso deve invocare notifyall() 4. È necessario verificare che ad ogni chiamata a wait() corrisponda una chiamata a notifyall() public synchronized int get() { while (available == false) try { wait(); // attende un dato dai Produttori catch (InterruptedException e) {... available = false; notifyall(); // notifica i produttori del consumo Sistemi Operativi L-A 21 Sistemi Operativi L-A 22 Esempio produttori-consumatori public synchronized void put(int value) { while (available == true) try { wait(); // attende il consumo del dato catch (InterruptedException e) {... available = true; notifyall(); // notifica i consumatori della // produzione di un nuovo dato I problemi di stop() e suspend() stop() forza la terminazione di un thread tutte le risorse utilizzate vengono immediatamente liberate (lock compresi) Se il thread interrotto stava compiendo un insieme di operazioni da eseguirsi in maniera atomica, l interruzione può condurre ad uno stato inconsistente del sistema Sistemi Operativi L-A 23 Sistemi Operativi L-A 24

I problemi di stop() e suspend() suspend() blocca l esecuzione di un thread, in attesa di una successiva invocazione di resume() non libera le risorse impegnate dal thread (non rilascia i lock) Se il thread sospeso aveva acquisito una risorsa in maniera esclusiva (ad es., interrotto durante l esecuzione di un metodo synchronized), tale risorsa rimane bloccata Priorità dei thread La classe Thread fornisce i metodi: setpriority(int num) getpriority() dove num [MIN_PRIORITY,MAX_PRIORITY] In generale un thread rimane in esecuzione fino a quando: smette di essere runnable (e diviene Not runnable o Dead) un thread con priorità superiore diviene eseguibile si esaurisce il quanto di tempo assegnato cede il controllo chiamando il metodo yield() Sistemi Operativi L-A 25 Sistemi Operativi L-A 26 Priorità dei thread Le specifiche JVM suggeriscono che vengano messi in esecuzione per primi i thread a priorità più elevata tra quelli in stato runnable si proceda secondo una politica round-robin tra i thread con identica priorità Alcune implementazioni di JVM delegano lo scheduling dei thread al SO, ove supportati Il comportamento reale diviene dunque dipendente dalla coppia JVM e SO Gruppi di thread Obiettivo: raccogliere una molteplicità di thread all interno di un solo gruppo per facilitare le operazioni di gestione JVM associa ogni thread ad un gruppo all atto della creazione del thread (tale associazione è permanente e non può essere modificata) ThreadGroup mythreadgroup = new ThreadGroup( MyGroup ); Thread mythread = new Thread(myThreadGroup, My1 ); Default: stesso gruppo del creatore (all inizio JVM crea il gruppo main ) Sistemi Operativi L-A 27 Sistemi Operativi L-A 28

Altri metodi di interesse per Java thread sleep(long ms) sospende thread per il # di ms specificato interrupt() invia un evento che produce l interruzione di un thread interrupted()/isinterrupted() verificano se il thread corrente è stato interrotto join() attende la terminazione del thread specificato isalive() true se thread è stato avviato e non è ancora terminato yield() costringe il thread a cedere il controllo della CPU Sistemi Operativi L-A 29