Multitasking e Multithreading Telematica II 17. Esercitazione/Laboratorio 6 Multitasking si riferisce all abilità di un computer di eseguire processi (jobs) multipli in maniera concorrente si ricorda che un processo = un programma che sta girando nel suo spazio di indirizzamento multitasking piu di un programma sta girando in maniera concorrente (p.e. UNIX, Windows) sembra come se piu programmi stiano girando allo stesso tempo Corso di Laurea in Ingegneria Informatica A.A. 2009-2010 2 Semestre Multithreading un thread è una singola sequenza in esecuzione all interno di un programma il multithread si riferisce a thread multipli controllati all interno di un singolo programma ciascun programma puo far girare thread multipli in ciascuno di essi (p.e. Web Browser) Prof. Giovanni Pascoschi 2 Concorrenza e Parallelismo multitasking Threads e processi multithreading CPU CPU1 CPU2 CPU main run Processo 1 Processo 2 Processo 3 Processo 4 GC il S.O. assegna la CPU a programmi differenti in maniera da dare l impressione della concorrenza il multi-thread estende l idea del multi-tasking applicandola a programmi singoli per ottenere di apparire come se fossero task multipli ciascun task è chiamato thread 3 4
A che servono i thread? Thread in un applicazione JAVA : fasi per mantenere la possibilità di rispondere da parte di un applicazione durante un task che deve funzionare per molto tempo (p.e. che esegue istruzioni sospensive accept(), readline()) per permettere l interruzione di task separabili alcuni problemi sono intrisecamente paralleli e quindi implementabili con i thread (p.e. task di acquisizione dati e task di elaborazione dati) quando viene eseguita un applicazione JAVA (.class): la JVM crea un oggetto Thread il cui compito (task) e definito dal metodo main( ) la JVM fa quindi partire il thread il thread esegue le istruzioni del programma una per una al termine dell esecuzione di tutte le istruzioni, il metodo ritorna e il thread muore per monitorare lo stato di alcune risorse in parallelo (p.e. nei database) 5 i thread possono essere richiesti esplicitamente da alcune API (Application Program Interface) 6 Thread multipli in un applicazione Creazione dei thread in JAVA ciascun thread ha il suo stack a run-time privato se due thread eseguono lo stesso metodo, ciascun thread avra la sua propria copia di variabili locali che i metodi usano tutti i thread vedono la stessa memoria dinamica due differenti thread possono agire sullo stesso oggetto e gli stessi campi statici in maniera concorrente JAVA nasce intrinsecamente con le funzionalita del multithreading esistono due modi di creare un oggetto di tipo Thread derivando la classe Thread e istanziando un nuovo oggetto di questa classe (permette di ridefinire alcuni metodi originari di Thread) implementando l interfaccia Runnable (permette di bypassare l impossibilita di usare l ereditarieta multipla) in entrambi i casi dovra essere implementato il metodo run( ) 7 8
Classe Thread Metodi della classe Thread #1 la classe Thread fa parte del package java.lang usando un oggetto di questa classe, il thread corrispondente puo essere fermato, messo in pausa e riattivato esistono molti costruttori quelli piu importanti sono: Thread( String n) crea un nuovo Thread con il nome n Thread( Runnable target) crea un nuovo oggetto Thread void start( ) crea un nuovo thread e lo rende di tipo runnable (ossia che puo essere eseguito) questo metodo puo essere richiamato solo una volta con l esecuzione di start() vien fatto partire il metodo run() del thread stesso void run( ) il nuovo thread inizia la sua vita all interno di questo metodo void stop( ) (deprecated) il thread viene terminato 9 10 Metodi della classe Thread #2 Derivazione della classe Thread void yield() obbliga l oggetto thread correntemente in esecuzione a fermarsi temporaneamente e permettere l esecuzione di altri thread consente soltanto a threads della stessa priorita di essere eseguiti void sleep(int m) o sleep(int m, int n) il thread si addormenta per m millisecondi piu n nanosecondi public class ThreadExample extends Thread { public void run () { for (int i = 1; i <= 100; i++) { System.out.println( - -- ); 11 12
Implementazione di Runnable Esempio di utilizzo dei Threads public class RunnableExample implements Runnable { public void run ( ) { for (int i = 1; i <= 100; i++) { System.out.println ( *** ); public class ThreadsStartExample { public static void main (String argv[ ]) { new ThreadExample( ).start (); new Thread(new RunnableExample()).start (); 13 14 Esercitazione 9 Thread in JAVA Esercitazione 10 Server TCP Multi-Thread in JAVA Viene illustrato un esercizio ThreadTest sulla gestione dei thread in JAVA (esercitazione 5FS) Viene illustrato un esercizio MultiTCPServer su un server TCP multi-thread in JAVA (esercitazione 12FS) 15 16
Riepilogo della lezione Fine della lezione Esercitazione/Laboratorio 6 Gestione Thread in JAVA Server TCP multi-thread Domande? 17 18 Esercizio n.15 Modalità iscrizione/effettuazione appelli luglio 2010 Implementare l esercizio n.9 modificando il server per essere adatto ad accettare richieste da piu client contemporaneamente (multi-thread). tutte le prenotazioni devono essere effettuate via email con indicazione Cognome, Nome, Matricola e sessione di esame a info@primeeng.it prenotazione allo scritto (data ultima) sessione del 8 luglio 2010 5 luglio 2010 sessione del 20 luglio 2010 17 luglio 2010 effettuazione orale/presentazione progetto circa una settimana dopo lo scritto invio email da parte dello studente per confermare come voto finale quello ottenuto allo scritto, oppure la partecipazione all orale 2 giorni dopo la pubblicazione degli esiti della prova scritta invio del progetto entro il 5 luglio 2010 per la 1 sessione invio del progetto entro il 17 luglio 2010 per la 2 sessione 19 20