Ottava Esercitazione. introduzione ai thread java mutua esclusione



Похожие документы
Multithreading in Java. Fondamenti di Sistemi Informativi

Esercitazione n 4. Obiettivi

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Java Virtual Machine

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

Programmazione a Oggetti Lezione 10. Ereditarieta

Un esercizio d esame. Flavio De Paoli

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:

Java: Compilatore e Interprete

Telematica II 17. Esercitazione/Laboratorio 6

GESTIONE DEI PROCESSI

Modulo 4: Ereditarietà, interfacce e clonazione

Esercizi della lezione 5 di Java

13. Chain of Responsibility

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

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

Java threads (2) Programmazione Concorrente

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Prova di Laboratorio di Programmazione

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Esercizi sul Monitor in Java

I Canvas. import java.awt.*; import javax.swing.*; public class Graf{ public Graf () { JFrame f = new JFrame("Finestra"); // crea frame invisibile

Definizione di classi con array di oggetti

Realizzazione di una classe con un associazione

Progettazione : Design Pattern Creazionali

Main System Monitor Keyboard

Programmazione ad Oggetti: JAVA. Esercitazione

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Concetto di Funzione e Procedura METODI in Java

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Algoritmi di Ricerca. Esempi di programmi Java

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

Programmazione Java: Variabili membro, Metodi La parola chiave final

Esercizi sugli Oggetti Monitor

Programmazione Orientata agli Oggetti in Linguaggio Java

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Ingegneria del Software

Prova d Esame Compito A

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Le variabili. Olga Scotti

Parola chiave extends

Prova d Esame Compito B

Introduzione alla programmazione in C

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

Soluzione dell esercizio del 2 Febbraio 2004

Esercizio Sincronizzazione Thread

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercizio 1: trading on-line

Introduzione alla Programmazione Orientata agli Oggetti. Classi, Oggetti e Messaggi

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

MOBILE WEB DESIGN TUTORIAL ANDROID METAIO AUGMENTED REALITY

appunti delle lezioni Architetture client/server: applicazioni server

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Corso sul linguaggio Java

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Simulazione traffico urbano

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

Gestione delle eccezioni in Java

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

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Programmazione concorrente in Java

Gerarchia delle classi Classi astratte Interfacce (Eccezioni) Laboratorio di Programmazione - Esercitazio 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Test di unità con JUnit4

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Traccia di soluzione dell esercizio del 25/1/2005

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

esercizi Esercizi / problemi

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Gestione dei thread in Java LSO 2008

MANUALE ESSE3 Gestione Registro delle lezioni

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

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio


Il problema del produttore e del consumatore. Cooperazione tra processi

Corso sul linguaggio Java

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

Funzioni. Il modello console. Interfaccia in modalità console

Programmazione II. Lezione 4. Daniele Sgandurra 30/09/2011.

Esercizi Java. class somma2 { static int somma(int a,int b) {return a+b; }

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Tale attività non è descritta in questa dispensa

Транскрипт:

Ottava Esercitazione introduzione ai thread java mutua esclusione

Agenda Esempio 1 Concorrenza in Java: creazione ed attivazione di thread concorrenti. Esercizio 2 da svolgere Concorrenza in Java: sincronizzazione di thread concorrenti tramite syncronized

Esempio 1 Definizione e uso dei java thread Scrivere una applicazione Java che simuli un semplice autolavaggio. Nell'autolavaggio possono entrare sia automobili che moto. Le automobili possono essere di due tipi, ossia auto grandi oppure auto piccole. Le moto, invece, sono di un unico tipo. Tutti gli autoveicoli devono essere oggetti attivi (ossia in grado di eseguire in maniera concorrente tramite thread) In particolare, ciascun autoveicolo, quando eseguito, dovrà stampare su stdout un opportuno messaggio che descriva le sue caratteristiche.

Esempio 1 - Traccia (2/2) Nello specifico, il programma deve definire le seguenti classi: Automobile: definisice le caratteristiche comuni di un'auto (marca, modello, targa, cilindrata,...), un metodo astratto gettype() ed un metodo concreto getmessage()che ritorna il messaggio da stampare e che richiami gettype() per capire il tipo di automobile. AutoGrande: eredita da Automobile e specializza il comportamento di gettype() in modo che ritorni la stringa "auto grande AutoPiccola: eredita da Automobile e specializza gettype() in modo che ritorni la stringa "auto piccola Moto: definisce le caratteristiche della moto Autolavaggio: implementa il metodo main() che crea un numero (a scelta) di veicoli di ciascun tipo e li mette in esecuzione tramite thread

Soluzione: classe Automobile public abstract class Automobile { private String marca; private String modello; private String targa; private int cilindrata; public Automobile(String marca, String modello, String targa, int cilindrata){ this.marca = marca; this.modello = modello; this.cilindrata = cilindrata; this.targa = targa; // continua..

..classe Automobile // continua public abstract String gettype(); public String getmessage(){ return "" + this + " Tipo " + gettype() + " Marca " + this.marca + "; Modello " + this.modello + "; Cilindrata " + this.cilindrata; public String tostring(){ return "[Automobile con targa: " + this.targa +"]"; //end of class Automobile

Soluzione: classe AutoGrande public class AutoGrande extends Automobile implements Runnable { Non posso estendere Thread, perchè devo già estendere Automobile. Quindi implemento Runnable. public AutoGrande(String marca, String modello, String targa, int cilindrata) { super(marca, modello, targa, cilindrata); @Override public String gettype() { return "AutoGrande ; // continua..

//.. continua..classe AutoGrande @Override public void run() { System.out.println("Il thread per l'automobile + this + " ha iniziato" +"l'esecuzione."); System.out.println(this.getMessage()); System.out.println("Il thread per l'automobile " + this + " sta per terminare"); //end of class AutoGrande

Soluzione: classe AutoPiccola public class AutoPiccola extends Automobile implements Runnable { public AutoPiccola(String marca, String modello, String targa, int cilindrata) { super(marca, modello, targa, cilindrata); @Override public String gettype() { return "AutoPiccola"; // continua..

..classe AutoPiccola //..continua @Override public void run() { System.out.println("Il thread per l'automobile "+this+" ha iniziato" +"l'esecuzione."); System.out.println(this.getMessage()); System.out.println("Il thread per l'automobile "+this+" sta per terminare"); //end of class AutoPiccola

Soluzione: classe Moto public class Moto extends Thread { private String marca; private String targa; private String modello; private int cilindrata; Posso estendere Thread, perchè questa classe non deve estendere nient altro public Moto(String marca, String modello, String targa, int cilindrata) { this.marca = marca; this.targa = targa; this.modello = modello; this.cilindrata = cilindrata; public String getmessage() { return this+" Marca +this.marca+"; Modello +this.modello+"; Cilindrata +this.cilindrata; // continua..

..classe Moto //.. continua @Override public String tostring() { return "[Moto con targa: " + this.targa + "]"; @Override public void run() { System.out.println("Il thread per la moto " + this + " ha iniziato" + "l'esecuzione."); System.out.println(this.getMessage()); System.out.println("Il thread per la moto " + this + " sta per terminare"); //end of class Moto

Classe Autolavaggio public class AutoLavaggio{ public static void main(string[] args) { AutoPiccola a1 = new AutoPiccola("FIAT", "Modello1", "AB123BC", 2000); AutoGrande a2 = new AutoGrande("Mercedes", "Modello2", "ILNY", 3000); Moto m1 = new Moto("Kawasaki,"Ninja, "ASTFG,2); Thread t1 = new Thread(a1); Thread t2 = new Thread(a2); t1.start(); t2.start(); m1.start(); AutoPiccola e AutoGrande non sono Thread, implementano solo Runnable. Mi devo solo ricordare di metterle in un Thread per poterle far partire.

Note Provare l applicazione (download dal sito web del corso). Due versioni: SimpleLavaggio RandomLavaggio (definizione casuale di tipologia e numero dei thread da generare) Link utili: o Oracle Java Doc per Java 8 SE: http://docs.oracle.com/javase/8/docs/api/ o Buon tutorial Oracle sulla concorrenza in Java: http://docs.oracle.com/javase/tutorial/essential/concurrency/

Esercizio 2 da svolgere Si consideri un teatro usato per lo svolgimento di eventi musicali. Per motivi di sicurezza il teatro non può accogliere più di MAX persone. Non essendo previsto un meccanismo di prenotazione, prima di un evento ogni cliente accede singolarmente al teatro, e, nel caso vi sia ancora posto, entra occupando un posto; nel caso in cui il teatro sia pieno, il cliente rinuncia ad entrare.

Esercizio 2 da svolgere Progettare un applicazione java che regoli gli accessi al teatro per un singolo evento, nella quale: ogni spettatore sia rappresentato da un thread distinto, il teatro sia rappresentato da un oggetto condiviso. In particolare, ogni thread che tenta l accesso al teatro e trova posto aggiorna lo stato del teatro e assiste allo spettacolo; altrimenti esso termina. Al termine dello spettacolo ogni spettatore esprime un parere (positivo o negativo) sull evento (che verrà registrato dal teatro), esce dal teatro, e termina. Il thread iniziale (main), una volta terminati tutti i thread spettatori, stampa il numero dei pareri positivi e negativi sullo spettacolo e temina.

Impostazione stampa_pareri Thread iniziale (main) Teatro entra esce ST1 ST2 ST3 STn Thread spettatori

Impostazione Supponiamo per semplicità che: Ogni spettatore sta dentro il teatro per il tempo che vuole. NON modelliamo un vero e proprio spettacolo in cui lo spettatore esce solo quando è finito. Classi da definire: Teatro: il teatro è una risorsa condivisa acceduta in modo concorrente dai thread spettatori. Quali variabili locali? Quali metodi (necessità di sincronizzazione!)? Spettatore Spettacolo (main)

Impostazione Classi da definire: Spettatore: il generico thread concorrente che accede al teatro. Il suo comportamento è definito dal metodo run: public class Spettatore extends Thread { Teatro t; <costruttore, etc.> public void run() { int entrato; entrato = t.entra(); if (entrato){ <visione spettacolo> t.esci(); else Verifica se c è posto e lo occupa Scrive il parere e libera il posto System.out.println("Il thread "+this.getname()+ " non e riuscito a entrare!");

Teatro: Il teatro è condiviso da thread concorrenti. Usiamo IL LOCK DELL OGGETTO: metodi synchronized. public class Teatro { // var. locali: posti occupati, pareri pos./neg. private int capienza,liberi,pos,neg; public synchronized int entra(){ <verifica posto+eventuale occupazione> return risultato; public synchronized void esce(){ <registrazione parere + liberazione posto> valore restituito: 1 se il thread ha occupato un posto, 0 se il teatro è pieno (il thread non entra) public syncronized void stampa_pareri(){ <stampa numero pareri positivi, numero negativi>

Classe Spettacolo: contiene il metodo main import java.util.random; public class Spettacolo{ private final static int MAX_NUM_SPETTATORI = 100; public static void main(string[] args) { Random r = new Random(System.currentTimeMillis()); int SP = r.nextint(max_num_spettatori); Spettatore[] ST = new Spettatore[SP]; Teatro T= new Teatro( ); <creazione SP spettatori> <attivazione SP spettatori> //attesa terminazione spettatori: for(i=0; i<sp; i++) ST[i].join(); //attesa terminazione spettatori T.stampa_pareri(); //stampa dei pareri