1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2003/2004.

Slides:



Advertisements
Presentazioni simili
Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) dopo ciascuna istruzione del main: public class Up extends Object { public.
Advertisements

1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
Oggetti Java.
Capitolo 2 Nozioni fondamentali su Java Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill.
JPA Overview della tecnologia. Java Persistence Architecture Definita nella JSR-220 EJB 3.0 ( Tentativo di unificare EJB2.1 con.
Programmazione Ingegneria TLC
Alcune Classi Standard Object, Vettori. Esercizio dellultima volta Superclasse Persona Sottoclasse Libro.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Esercizio 2. Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni di classe.
Fondamenti di Informatica
Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel.
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Esempio: Tombola! Parte seconda.
Unified Modeling Language class C {…} class B extends C {…} Esiste una notazione grafica per mostrare le relazioni di ereditarietà. Object StringC B Tutte.
J0 1 Marco Ronchetti Java Threads & Sincronizzazione.
Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.
Richiami di Java Multithreading. Threads (subclassing) public class A { public void a_method { C t = new C(); //C t = new C(String name); t.start(); …
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
prompt> java SumAverage
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 12 (19 novembre 2008) Programmazione in Java: i metodi statici.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
Corso di Informatica (Programmazione)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) JAVA: i commenti Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Esercitazione 2 (3 dicembre 2008)
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Scomposizione di stringhe
JAVA C import java.util.*; #include <stdio.h>
Soluzione Esercizio - Classe Vettore
Programming with JXTA Hello World Peer discovery Peer Group discovery Creating Peer group Joining a Peer Group.
Programmazione II: Tecniche Avanzate. (A.A. 1999/2000) - Lezione 6 1 Estensione di classi: il Contratto INTERFACCIA E REALIZZAZIONE Che cosa realizza una.
Selezione (=scelta) con “if-else”
Programmazione distribuita in Java
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Diagramma di flusso del problema del Supermercato.
void binario(int n); …………………
Ese 2 (del 31 Marzo 2004). Mostrare l'evoluzione dello stato (ambiente di classi, heap, pila, System.out) durante la valutazione delle seguenti dichiarazioni.
Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,
Soluzioni 1.Struttura base soluzione 2.Lettura dei tasti 3.Identificazione dei tasti 4.Accensione dei LED 5.Rotazione dei LED 6.Rotazione dei tasti fino.
Diagramma di flusso del problema del Calcolo del Bollo di Circolazione
Programmazione concorrente
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
Corso di Programmazione in Java – Esercizio n° 001
Diagramma di flusso del problema dello stipendio del rappresentante.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Lezione n° 07 - Esercitazione
Concorrenza 1 Conto corrente Nella famiglia Giambietti non ci sono grossi problemi economici. Infatti il padre, Enea, di professione artista free-lance,
Esercizi.
Stack Già visto l’altra volta senza gestione eccezioni, le prime tre slide servono solo come ripasso, dalla quarta argomento nuovo class Stack { int data[];
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2014/15 Lezioni 1-2.
Esercitazione Ereditarietà Polimorfismo. Entita’ Geometrica PuntoCerchioPoligono TriangoloQuadrilatero Rettangolo Quadrato.
15/11/2004Laboratorio di Programmazione - Luca Tesei1 Costrutto condizionale Scelte, blocchi.
JDBC Java DataBase Connectivity SISTEMI ITIS B. CASTELLI Anno Scolastico
Una "vera" classe.. ..un esempio pratico: la calcolatrice
Sintassi: Programma e classi Program::=prog {ClassDeclList {StatList}} ClassDeclList::=ClassDecl ClassDeclList |  ClassDecl::=class Ide c [StaticMetDefList]
1 Un esempio con iteratore: le liste ordinate di interi.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
1 novembre I nomi in Java F. Bombi 1 novembre 2002.
Programmazione Concorrente e Distribuita
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Capitolo 12 Thread Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Gestione dei thread in Java
Programmazione in Java
Oggetti Java.
Elementi di programmazione concorrente in Java: i threads
Dalla programmazione tradizionale al paradigma OO
Transcript della presentazione:

1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2003/2004

2 Lettori-Scrittori con sincronizzazione Java (1) public class Database { private int readerCount; private boolean dbReading; private boolean dbWriting; public Database() { readerCount = 0; dbReading = false; dbWriting = false; } public synchronized int startRead() { /* lucidi seguenti */ } public synchronized int endRead() { /* lucidi seguenti */ } public synchronized void startWrite() { /* lucidi seguenti */ } public synchronized void endWrite() { /* lucidi seguenti */ } }

3 Lettori-Scrittori con sincronizzazione Java (2) public synchronized int startRead() { while (dbWriting == true) { try { wait(); } catch (InterruptedException e) { } } readerCount++; if (readerCount == 1) dbReading = true; return readerCount; }

4 Lettori-Scrittori con sincronizzazione Java (3) public synchronized int endRead() { readerCount- -; if (readerCount == 0) { dbReading=false; notifyAll(); } return readerCount; }

5 Lettori-Scrittori con sincronizzazione Java (4) public synchronized void startWrite() { while (dbReading == true || dbWriting == true) { try { wait(); } catch (InterruptedException e) { } } dbWriting = true; } public synchronized void endWrite() { dbWriting = false; notifyAll(); }

6 Lettori-Scrittori con sincronizzazione Java (5) public class Readers extends Thread { Database db; int id; public Readers(Database db,int id){ this.db=db; this.id=id; } public void run(){ while (true){ db.startRead(); db.endRead(); }

7 Lettori-Scrittori con sincronizzazione Java (6) public class Writers extends Thread { Database db; int id; public Writers(Database db,int id){ this.db=db; this.id=id; } public void run(){ while (true){ db.startWrite(); db.endWrite(); }

8 Lettori-Scrittori con sincronizzazione Java (7) public class TestRW { public static void main(String [ ] args){ Database db=new Database(); for (int i=0;i<10;i++){ (new Readers(db,i)).start(); (new Writers(db,i)).start(); }

9 Blocchi sincronizzati (1) Anche blocchi di codice, oltre che interi metodi, possono essere dichiarati synchronized. Ciò consente di associare un lock la cui durata è tipicamente inferiore a quella di un intero metodo synchronized.

10 Blocchi sincronizzati (2) public void syncronized F() { // sezione non critica (p.es.: inizializzazione di variabili locali) // sezione critica // sezione non critica } public void F() { // sezione non critica synchronized (this) { // sezione critica } // sezione non critica }

11 I 5 filosofi con sincronizzazione Java (1) Supponiamo esista un tavolo con 5 piatti, 5 posti a tavola, 5 forchette ed al centro uninsalatiera di spaghetti. I filosofi seduti intorno al tavolo sanno fare solo due cose: mangiare e pensare. Il problema è che, siccome si tratta di spaghetti, il generico filosofo per servirsi ha bisogno di entrambe le forchette (quella alla sua DS e quella alla sua SN). Poi per mangare gliene serve solo una. La forchetta a SN delli-simo filosofo è: i; La forchetta a DS delli-sima filosofo è: (i+1)%5;

12 I 5 filosofi con sincronizzazione Java (2) (senza deadlock) Public class 5Filosofi { private boolean fork[ ]={true,true,true,true,true}; public synchronized void getForks(int i) { while(!fork[i] || !fork[(i+1)%5]) try{wait(); }catch(InterruptedException e){ } fork[i]=false; fork[(i+1)%5]=false; notifyAll(); /*eventuale*/ } public synchronized void putForks(int i) { fork[i]=true; fork[(i+1)%5]=true; notifyAll(); }

13 I 5 filosofi con sincronizzazione Java (3) (senza deadlock e senza starvation) Public class 5Filosofi { private boolean fork[ ]={true,true,true,true,true}; int cont[]={0,0,0,0,0}; public synchronized void getForks(int i) { while(!fork[i] || !fork[(i+1)%5] || (cont[i]>cont[(i+1)%5)] || (cont[i]>cont[(i+4)%5]) try{wait(); }catch(InterruptedException e){ } fork[i]=false; fork[(i+1)%5]=false; notifyAll(); /*eventuale*/ } public synchronized void putForks(int i) { fork[i]=true; fork[(i+1)%5]=true; cont[i]++; notifyAll(); }

14 I 5 filosofi con sincronizzazione Java (4) (I Threads Filosofo) public class Filosofo extends Thread { int id; 5Filosofi cf; public Filosofo(int id, String nome, 5Filosofi cf) { super(nome); this.id=id; this.cf=cf; } public void run() { for(; ;){ cf.getForks(id); System.out.println(Il filosofo+id+ mangia); try{ sleep((int)(Math.random()*5000)); catch(InterruptedException e){ } /*il filosofo sta mangiando*/ cf.putForks(id); try{ sleep((int)(Math.random()*5000));} catch(InterruptedException e){ } /*il filosofo sta pensando*/ }

15 I 5 filosofi con sincronizzazione Java (4) (Il main) public class Test5Filosofi { public static void main(String [] args){ 5Filosofi gestore=new 5Filosofi(); for (int i=0;i<5;i++) new Filosofo(i,Filosofo# +i, gestore).start(); }

16 Il problema dello Sleeping Barber E dato un salone di barbiere, avente un certo numero di posti dattesa ed ununica poltrona di lavoro. Nel salone lavora un solo barbiere, il quale è solito addormentarsi sulla poltrona di lavoro in assenza di clienti. Arrivando nel salone, un cliente può trovare le seguenti situazioni: Il barbiere dorme sulla poltrona di lavoro. Il cliente sveglia il barbiere e si accomoda sulla poltrona di lavoro, quindi il barbiere lo serve. Il barbiere sta servendo un altro cliente: se ci sono posti dattesa liberi, il cliente attende, altrimenti se ne va. Scrivere in Java un programma che risolva tale problema, simulando lattività dei diversi soggetti (il Salone, il Barbiere, i Clienti) ed evidenziandone su video lo stato. Limplementazione della soluzione deve far uso delle opportune primitive di sincronizzazione e mutua esclusione.

17 Salone (1) public class Salone implements Runnable { int sedie,posti; Thread barbiere=null; boolean dorme,cliente; boolean fineAttesa; public Salone(int sedie){ this.sedie=sedie; posti=sedie; dorme=true; cliente=false; fineAttesa=false; barbiere=new Thread(this); barbiere.start(); } public synchronized boolean richiesta ( ) { … } public void run ( ) { … } }

18 Salone: richiesta (2) public synchronized boolean richiesta( ) { if (posti==0) return false; if ( (posti<sedie) || (!dorme)){ posti--; while(true) { try {wait();}catch(InterruptedException e){ } if (fineAttesa){ fineAttesa=false; notifyAll(); break; } cliente=true; } else{ dorme=false; cliente=true; notify(); } while (cliente) try{wait();}catch(InterruptedException e){} return true; }

19 Salone: run (3) public void run ( ) { while (true){ synchronized(this) { if (!cliente) { if (posti==sedie) { dorme=true; while(dorme) try{wait();}catch(InterruptedException e){ } } else{posti++;fineAttesa=true; notify(); while (fineAttesa) try{wait();}catch(Interrupted…){} } /*fine synchronized*/ try{ Thread.sleep((int)(Math.random*1000));}catch(…){}; synchronized (this){ cliente=false; notifyAll(); } }/*fine Salone*/

20 Cliente (1) class Cliente extends Thread { private Salone salone; private int id; public Cliente (Salone salone, int id) { this.salone = salone; this.id = id; } public void run () { while (true) { boolean servito=salone.richiesta(); if (servito) { int tempoDiRicrescita = (int)((Math.random()*3000)); System.out.println ("Il cliente "+id+" attende la ricrescita dei capelli. "+"Tempo di ricrescita = "+tempoDiRicrescita); try { sleep (tempoDiRicrescita); } catch (InterruptedException e) { System.out.println (e); }

21 Cliente (2) else{ System.out.println(Il cliente+ id+trova tutto pieno e va via…); int tempoDiRiprovo= (int)((Math.random()*1000)); try { sleep (tempoDiRiprovo); } catch (InterruptedException e) { System.out.println (e); } } } // while }

22 Il problema dello Sleeping Barber public class SleepingBarber { public static void main (String args[]) { int postiDiAttesa=5; Salone s = new Salone (postiDiAttesa); /*il barbiere è già attivo*/ for (int i = 1; i <= 10; i++) { Cliente c = new Cliente (s, i); c.start (); }