Programmazione Orientata agli Oggetti in Linguaggio Java



Documenti analoghi
Programmazione Orientata agli Oggetti in Linguaggio Java

Tecnologie di Sviluppo per il Web

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Tecnologie di Sviluppo per il Web

Programmazione Orientata agli Oggetti in Linguaggio Java

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:

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

Parola chiave extends

Oggetti Lezione 3. aspetti generali e definizione di classi I

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

Java threads (2) Programmazione Concorrente

Java Virtual Machine

Synchronized (ancora)

Tecnologie di Sviluppo per il Web

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

Programmazione Orientata agli Oggetti in Linguaggio Java

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

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

19. Introduzione al multi-threading

GESTIONE DEI PROCESSI

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

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

Programmazione Orientata agli Oggetti in Linguaggio Java

Realizzazione di una classe con un associazione

20. Appunti sulle liste (gestione in linguaggio C#) 16/04/2015 Arraylist

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

Algoritmi di Ricerca. Esempi di programmi Java

Java: Compilatore e Interprete

Modulo 4: Ereditarietà, interfacce e clonazione

Multithreading in Java. Fondamenti di Sistemi Informativi

Concetto di Funzione e Procedura METODI in Java

Supermarket Progetto di Programmazione Febbraio 2010

Esercizi della lezione 5 di Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Richiesta pagina PHP (es: index.php)

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Programmazione a Oggetti Lezione 10. Ereditarieta

Main System Monitor Keyboard

Tecnologie di Sviluppo per il Web

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Architettura MVC-2: i JavaBeans

Tecnologie di Sviluppo per il Web

Tricks & Tips. [Access] Tutorial - ActiveX - Controllo Tree View. - Michele de Nittis - Versione: 1 Data Versione: venerdì 30 agosto 2002

La struttura dati ad albero binario

Inizializzazione, Assegnamento e Distruzione di Classi

Tipi di Dato Ricorsivi

Programmazione in Java Parte I: Fondamenti

Programmazione Orientata agli Oggetti in Linguaggio Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

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

Sommario. Introduzione Architettura Client-Server. Server Web Browser Web. Architettura a Due Livelli Architettura a Tre Livelli

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

dall argomento argomento della malloc()

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

Elementi di semantica operazionale

Telematica II 17. Esercitazione/Laboratorio 6

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

Test di unità con JUnit4

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

Programmazione Orientata agli Oggetti in Linguaggio Java

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Introduzione ai tipi di dato astratti: applicazione alle liste

Tecnologie di Sviluppo per il Web

Arduino: Programmazione

Progettazione : Design Pattern Creazionali

Introduzione a Classi e Oggetti

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

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

Programmazione Orientata agli Oggetti in Linguaggio Java

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

Un esercizio d esame. Flavio De Paoli

Esercitazione n 4. Obiettivi

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

SAPIENZA Università di Roma, Facoltà di Ingegneria

Il costrutto monitor [Hoare 74]

Programmazione a Oggetti Modulo B

Protezione. Protezione. Protezione. Obiettivi della protezione

Introduzione JDBC interfaccia java.sql driver caricare i driver

Abstract Data Type (ADT)

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

Eclipse. Avviare un progetto e compilare un semplice programma

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

Esercizio 1: trading on-line

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Funzioni in C. Violetta Lonati

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

T E O R I A D I P R O G E T T A Z I O N E D E L S O F T W A R E

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Transcript:

Programmazione Orientata agli Oggetti in Linguaggio Java Tecniche di Programmazione: C# versione 1.1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca Università della Basilicata mecca@unibas.it Tecniche di Programmazione: C# >> Sommario Sommario Le API di.net Date Collezioni Ordinamento Clonazione e Serializzazione Classi Nidificate Thread 2

Tecniche di Programmazione: C# >> Le API di.net Le API di.net Nel seguito alcuni aspetti delle applicazioni di riferimento simili a quelli già discussi per Java La buona notizia le API di.net sono più recenti di quelle di Java è stato fatto uno sforzo per semplificare alcuni aspetti della programmazione 3 Tecniche di Programmazione: C# >> Date Date Un esempio la gestione delle Date tutte le operazioni principali si possono fare con la classe System.DateTime In effetti, però... il meccanismo è identico a quello di Java rappresentazione astratta (millisecondi) + internazionalizzazione calendari e formattazione 4

Tecniche di Programmazione: C# >> Date Date System.DateTime si tratta in effetti di una struttura e non di una classe Differenza tra classi e strutture la principale è che le istanze delle strutture sono allocate nello stack e non nello heap non si manipolano attraverso i riferimenti ma come variabili dei tipi primitivi estendono System.ValueObject 5 Tecniche di Programmazione: C# >> Date Date In effetti dal punto di vista dell utilizzo la differenza non si nota I metodi di DateTime permettono di fare tutto quello che in Java è possibile fare con Date + GregorianCalendar + DateFormat creare date sulla base del calendario, fare i conti, formattare diversamente le date 6

Tecniche di Programmazione: C# >> Date Date >> System.DateTime In particolare esistono diversi costruttori esistono proprietà per ottenere giorno, mese, anno, ore, minuti e secondi nota: i mesi vanno da 1 a 12 esistono varianti del metodo ToString() che accettano un parametro che indica il formato per stampare la data esistono metodi per i conti (Add(), Subtract()) 7 Tecniche di Programmazione: C# >> Date namespace Unibas.Appuntamenti.Modello { public class Giorno : System.IComparable { private System.DateTime datetime; private System.Collections.ArrayList listaimpegni = new System.Collections.ArrayList(); public Giorno(int gg, int mese, int anno) { if (gg < 0 gg > 31) { throw new System.ArgumentException( Giorno scorretto: " + gg); if (mese < 1 mese > 12) { throw new System.ArgumentException( Mese scorretto: " + mese); if (anno < 0) { throw new System.ArgumentException( Anno scorretto: " + anno); this.datetime = new System.DateTime(anno, mese, gg); public int NumGiorno { get { return this.datetime.day; public int Mese { get { return this.datetime.month; public int Anno { get { return this.datetime.year; public string ToShortString() { return this.datetime.tostring("dd/mm/yy");... 8

Tecniche di Programmazione: C# >> Date namespace Unibas.Appuntamenti.Modello { public class Orario : System.IComparable { private System.DateTime datetime; public Orario(int ora, int minuti) { if (ora < 0 ora > 23) { throw new System.ArgumentException( Ora scorretta: " + ora); if (minuti < 0 minuti > 59) { throw new System.ArgumentException( Minuti scorretti: " + minuti); this.datetime = new System.DateTime(1970, 1, 1, ora, minuti, 0); public int Ora { get { return this.datetime.hour; public int Minuti { get { return this.datetime.minute; public int CompareTo(System.Object orario) { return System.DateTime.Compare(this.dateTime, ((Orario)orario).dateTime);... 9 Tecniche di Programmazione: C# >> Collezioni Collezioni Le collezioni di.net System.Collections.ArrayList implementa l interfaccia System.Collections.IList System.Collections.Hashtable Hashtable implementazione di un dizionario associativo basata su hash 10

Tecniche di Programmazione: C# >> Collezioni Collezioni Hashing vengono utilizzati i metodi GetHashCode() ed Equals() ereditati da Object I metodi di Hashtable Add(Object chiave, Object valore) Count indicizzatore per l accesso ai valori data la chiave: <table>[<chiave>] 11 Tecniche di Programmazione: C# >> Collezioni namespace Unibas.Appuntamenti.Modello { public class Agenda { private string utente; private System.Collections.Hashtable giorni = new System.Collections.Hashtable(); public string Utente { get { return this.utente; set { this.utente = value; public void AddGiorno(Giorno giorno) { this.giorni.add(giorno.toshortstring(), giorno); public void RemoveGiorno(string data) { this.giorni.remove(data); public Giorno GetGiorno(string data) { return (Giorno)(this.giorni[data]); public int NumeroGiorni { get { return this.giorni.count;... 12

Tecniche di Programmazione: C# >> Collezioni Collezioni Nota il namespace System.Collections è per molti versi diverso da java.util implementa tipi di collezioni diversi non esiste un implementazione analoga a Set o a LinkedList esistono implementazioni mancanti in Java: es: SortedList la radice della gerarchia è ICollection 13 Tecniche di Programmazione: C# >> Collezioni Collezioni Iteratori anche in.net esiste il concetto di iteratore per le collezioni, chiamati enumeratori System.Collections.IEnumerator Due membri principali boolean MoveNext() Object Current 14

Tecniche di Programmazione: C# >> Collezioni Collezioni Esempio: la stampa degli impegni public string StringaImpegni() { OrdinaImpegni(); System.Text.StringBuilder stringaimpegni = new System.Text.StringBuilder(); System.Collections.IEnumerator enumerator = listaimpegni.getenumerator(); while (enumerator.movenext()) { stringaimpegni.append(enumerator.current.tostring()); stringaimpegni.append("\n"); return stringaimpegni.tostring(); 15 Tecniche di Programmazione: C# >> Collezioni Collezioni Ma... in C# c è un modo molto più semplice per scrivere il ciclo Ciclo foreach è una forma di ciclo for migliorato scandisce tutti gli elementi di una collezione utilizzando (in modo nascosto) un iteratore adeguato alla collezione sintassi: foreach (<tipo> <rifer> in <collez>) 16

Tecniche di Programmazione: C# >> Collezioni Collezioni Esempio: stampa impegni con foreach public string StringaImpegni() { OrdinaImpegni(); System.Text.StringBuilder stringaimpegni = new System.Text.StringBuilder(); foreach (IImpegno impegnoiesimo in this.listaimpegni) { stringaimpegni.append(impegnoiesimo.tostring()); stringaimpegni.append("\n"); return stringaimpegni.tostring(); 17 Tecniche di Programmazione: C# >> Collezioni Collezioni Esempio: passo di simulazione public void Simula() { System.Collections.IList listaanimali = this.scacchiera.listaanimali; foreach (Animale animale in listaanimali) { if (animale!= null) { animale.agisci(this.scacchiera); 18

Tecniche di Programmazione: C# >> Ordinamento Ordinamento // in Giorno public void OrdinaImpegni() { this.listaimpegni.sort(); Analogo a Java per usare i metodi forniti dalla piattaforma è necessario implementare System.IComparable un unico metodo: int CompareTo(Object o) con la stessa semantica dell analogo Java Nota tutte le collezioni di.net hanno un metodo Sort() per ordinarle 19 Tecniche di Programmazione: C# >> Ordinamento Ordinamento // in Agenda using System.Collections; public override string ToString() { System.Text.StringBuilder stringa = new System.Text.StringBuilder(); stringa.append("utente: " + this.utente + "\n"); System.Collections.ICollection collgiorni = this.giorni.values; System.Collections.ArrayList listagiorni = Ordina(collGiorni); foreach (Giorno giornoiesimo in listagiorni) { stringa.append(giornoiesimo); return stringa.tostring(); private ArrayList Ordina(System.Collections.ICollection coll) { ArrayList lista = new System.Collections.ArrayList(coll); lista.sort(); return lista; 20

Tecniche di Programmazione: C# >> Clonazione e Serializzazione Clonazione e Serializzazione Il processo di clonazione è più razionale che in Java Oggetti clonabili devono implementare System.ICloneable che prevede che sia definito il metodo Object Clone() quindi ICloneable NON è un interfaccia vuota 21 Tecniche di Programmazione: C# >> Clonazione e Serializzazione Clonazione e Serializzazione Il supporto alla clonazione superficiale fornito dal metodo MemberWiseClone() ereditato da Object metodo protetto Quindi, tipicamente nella sottoclasse implemento ICloneable definisco public Object Clone() utilizzo super.memberwiseclone() per ottenere una copia superficiale 22

Tecniche di Programmazione: C# >> Clonazione e Serializzazione Clonazione e Serializzazione Serializzazione.NET supporta vari tipi di serializzazione Serializzazione binaria namespace System.Runtime.Serializazion Serializzazione XML namespace System.Xml.Serialization 23 Tecniche di Programmazione: C# >> Classi Nidificate Classi Nidificate Le classi interne uno strumento decisamente meno importante ed evoluto in C# rispetto a Java considerato probabilmente troppo complesso per il programmatore In particolare esistono solo classi nidificate (statiche) non è necessario specificare il qualificatore static 24

Tecniche di Programmazione: C# >> Classi Nidificate Classi Nidificate Una virtuale LinkedList per C# non esiste una implementazione di LinkedList nel namespace System.Collections di conseguenza il codice successivo è puramente riportato a titolo di esempio esistono però varie implementazioni disponibili in rete 25 Tecniche di Programmazione: C# >> Classi Nidificate namespace System.Collections { public class LinkedList : IList { // classe interna statica Entry private class Entry { Object element; Entry next; Entry previous; Entry(Object element, Entry next, Entry previous) { this.element = element; this.next = next; this.previous = previous; non è necessario specificare static perchè tutte le classi interne sono automaticamente statiche // proprietà private Entry header = new Entry(null, null, null); private int size = 0; // costruttori public LinkedList() { header.next = header.previous = header;... 26

Tecniche di Programmazione: C# >> Classi Nidificate Classi Nidificate Una conseguenza dal momento che in C# non esistono classi interne, non esistono classi anonime di conseguenza non è possibile utilizzarle al modo di Java, per passare metodi come parametri La soluzione di C# uno strumento dedicato del linguaggio: i delegati 27 Tecniche di Programmazione: C# >> Delegato oggetto utilizzato per eseguire metodi diversi il delegato implementa un interfaccia fatta di un unico metodo alla creazione dell oggetto è necessario specificare un implementazione per il metodo ovvero passare un metodo concreto come argomento per il metodo astratto (parametro) 28

Tecniche di Programmazione: C# >> Il termine delegato richiama la funzione dell oggetto ovvero il fatto che l oggetto NON ha propri metodi da eseguire di volta in volta gli viene associato un metodo concreto e l oggetto delega le invocazioni che riceve al metodo specificato 29 Tecniche di Programmazione: C# >> I passi per utilizzare un delegato sono vari I passo: definizione dell interfaccia descrive l interfaccia del delegato, ovvero il prototipo del metodo che la compone II passo: creazione del delegato specifica una implementazione per il metodo previsto dal delegato III passo: chiamata 30

Tecniche di Programmazione: C# >> >> Calcolatrice. Esempio la calcolatrice con i delegati definisco un delegato Operazione definisco in Principale i tre metodi (somma(), sottrai(), moltiplica()) di volta in volta creo un oggetto delegato di tipo Operazione associandogli uno dei tre metodi poi eseguo il delegato 31 Tecniche di Programmazione: C# >> La definizione del delegato viene riportata al livello di una dichiarazione di classe o di interfaccia public delegate double Operazione(double a, double b); definisce un nuovo tipo di delegato chiamato Operazione gli oggetti di questo tipo hanno un interfaccia fatta da un unico metodo (anonimo) che riceve due argomenti di tipo double e restituisce un risultato di tipo double 32

Tecniche di Programmazione: C# >> namespace Calcolatrice. { public delegate double Operazione(double a, double b); public class Principale { private int SchermoMenu() { System.Console.WriteLine("-------------------------------"); System.Console.WriteLine(" Calcolatrice "); System.Console.WriteLine("-------------------------------"); System.Console.WriteLine(" 1. Esegui somma"); System.Console.WriteLine(" 2. Esegui differenza"); System.Console.WriteLine(" 3. Esegui moltiplicazione"); System.Console.WriteLine(" 0. Esci"); System.Console.Write(" Scelta ----> "); int scelta = Unibas.Utilita.Console.LeggiIntero(); while ((scelta < 0) (scelta > 3)) { System.Console.WriteLine(" Errore. Ripeti ----> "); scelta = Unibas.Utilita.Console.LeggiIntero(); return scelta; public static void Main(string[] args) { new Principale().EseguiOperazioni();... 33 Tecniche di Programmazione: C# >> public double Somma(double a, double b) { return a + b; public double Sottrai(double a, double b) { return a - b; public double Moltiplica(double a, double b) { return a * b; public void EseguiOperazioni() { Operazione operazione = null; bool continua = true; while (continua) { double a, b; int scelta = SchermoMenu(); if (scelta == 0) { continua = false; else { System.Console.Write( Primo argomento: --> "); a = Unibas.Utilita.Console.LeggiDouble(); System.Console.Write( Secondo argomento: --> "); b = Unibas.Utilita.Console.LeggiDouble(); if (scelta == 1) { operazione = new Operazione(this.Somma); else if (scelta == 2) { operazione = new Operazione(this.Sottrai); else if (scelta == 3) { operazione = new Operazione(this.Moltiplica); System.Console.WriteLine("\n Risultato: " + operazione(a, b) + "\n"); // fine Principale creazione del delegato; viene specificato come argomento del costruttore il riferimento al metodo concreto 34

Tecniche di Programmazione: C# >> Sintassi della dichiarazione delegate <tipo> <nome> ([<parametri>]); Esempio public delegate double Operazione(double a, double b); Semantica della dichiarazione definisce un nuovo tipo di delegato il cui metodo anonimo ha il tipo di ritorno e i parametri specificati 35 Tecniche di Programmazione: C# >> Sintassi della creazione <rif> = new <NomeDelegato>(<metodo>); dove <rif> è un riferimento <NomeDelegato> è un tipo di delegato <metodo> è il nome del metodo da associare al metodo anonimo; forma <rif>.<nome> deve avere lo stesso prototipo del delegato es: operazione = new Operazione(this.somma); 36

Tecniche di Programmazione: C# >> Anatomia della creazione operazione = new Operazione(this.Somma); this.somma una strana sintassi viene interpretato come un riferimento all oggetto System.Reflection.MethodInfo che descrive il metodo Somma dell oggetto Principale è una sintassi utilizzabile solo in questo caso 37 Tecniche di Programmazione: C# >> Sintassi della chiamata <rif>([<argomenti>]); es: operazione(a, b); Semantica viene eseguito il metodo specificato alla creazione dell oggetto delegato sugli argomenti specificati 38

Tecniche di Programmazione: C# >> Una categoria particolare di delegati i delegati multicast Delegato multicast delegato capace di eseguire più di un metodo contemporaneamente in effetti si tratta di un delegato risultato della combinazione di più delegati semplici l esecuzione del delegato produce l esecuzione di tutti i delegati combinati 39 Tecniche di Programmazione: C# >> Vincolo sintattico possono essere combinati solo delegati il cui tipo di ritorno è void In particolare qualsiasi delegato con tipo di ritorno void è considerato un delegato multicast e può essere utilizzato come delegato ordinario ( singlecast ) oppure per combinare altri delegati multicast 40

Tecniche di Programmazione: C# >> In concreto un delegato multicast mantiene una lista di riferimenti ad altri delegati multicast quando viene eseguito esegue tutti i delegati della lista Per aggiungere un delegato alla lista operatore + Per rimuovere un delegato dalla lista operatore - 41 Tecniche di Programmazione: C# >> >> Calcolatrice. Esempio la calcolatrice con i delegati multicast vengono utilizzati tre delegati per stampare il risultato di somma, sottrazione e prodotto viene creato un delegato multicast che combina i tre per eseguire tutti e tre le stampe 42

Tecniche di Programmazione: C# >> namespace Calcolatrice. { public delegate void Risultato(double a, double b); public class PrincipaleMulticast { può essere usato come delegato multicast il tipo di ritorno è void public void EseguiOperazioni() { double a, b; System.Console.Write("Primo argomento: --> "); a = Unibas.Utilita.Console.LeggiDouble(); System.Console.Write( Secondo argomento: --> "); b = Unibas.Utilita.Console.LeggiDouble(); Risultato somma = new Risultato(this.StampaSomma); Risultato differenza = new Risultato(this.StampaDifferenza); Risultato prodotto = new Risultato(this.StampaProdotto); Risultato risultato = somma + differenza; risultato += prodotto; risultato(a, b); public void StampaSomma(double a, double b) { System.Console.WriteLine("Somma: " + (a + b)); public void StampaDifferenza(double a, double b) { System.Console.WriteLine("Differenza: " + (a - b)); public void StampaProdotto(double a, double b) { System.Console.WriteLine("Somma: " + (a * b)); public static void Main(string[] args) { new PrincipaleMulticast().EseguiOperazioni(); creazione del delegato multicast come combinazione di somma, differenza e poi anche prodotto 43 Tecniche di Programmazione: C# >> Nota tutti i tipi delegati ereditano dalla classe System.Delegate estesa da System.MulticastDelegate Alcuni metodi static void Combine(Delegate d1, Delegate d2) static void Remove(Delegate d1, Delegate d2) Delegate[] GetInvocationList() 44

Tecniche di Programmazione: C# >> I membri di una classe C# possono essere di vari tipi campi costruttori metodi proprietà.net (get/set) classi nidificate, enumerazioni, strutture delegati, eventi (>>) 45 Tecniche di Programmazione: C# >> Thread Thread Un esempio di uso dei delegati i thread di C# Il namespace per i thread System.Threading Le classi fondamentali System.Threading.Thread System.Threading.ThreadStart System.Threading.Monitor 46

Tecniche di Programmazione: C# >> Thread Thread Per creare un nuovo thread bisogna creare un oggetto di tipo Thread e poi chiamare il metodo Start() sull oggetto Creare l oggetto di tipo Thread bisogna specificare il metodo da eseguire per farlo è necessario creare un delegato di tipo ThreadStart public delegate void ThreadStart() e passare il delegato al costruttore di Thread 47 Tecniche di Programmazione: C# >> Thread Thread I passi creare il metodo per avviare il thread (analogo al metodo run() in Java) creare un delegato di tipo ThreadStart per eseguire il metodo selezionato creare un oggetto di tipo Thread a partire dal delegato avviare il thread chiamando Start() 48

Tecniche di Programmazione: C# >> Thread Thread >> EsempioThread Per controllare il Thread static void Sleep(int millis): metodo statico che mette a dormire il thread che lo esegue void Join(): mette il thread che lo esegue in attesa che termini il thread su cui viene chiamato void Abort(): solleva ThreadAbortException nel thread su cui viene chiamato; può essere usato per distruggere il thread 49 Tecniche di Programmazione: C# >> Thread using System.Threading; public class PrimoEsempio { private int id; public PrimoEsempio(int id) { this.id = id; public void Run() { for (int i = 0; i < 20; i++) { System.Console.WriteLine("In esecuzione il thread " + this.id); Thread.Sleep(1000); public static void Main(string[] args) { PrimoEsempio primo = new PrimoEsempio(0); PrimoEsempio secondo = new PrimoEsempio(1); ThreadStart primodelegato = new ThreadStart(primo.Run); ThreadStart secondodelegato = new ThreadStart(secondo.Run); Thread thread0 = new Thread(primoDelegato); Thread thread1 = new Thread(secondoDelegato); thread0.start(); thread1.start(); System.Console.WriteLine("Main concluso"); 50

Tecniche di Programmazione: C# >> Thread using System.Threading; public class PrimoEsempioJoin { private int id; public PrimoEsempioJoin(int id) { this.id = id; public void Run() { for (int i = 0; i < 20; i++) { System.Console.WriteLine("In esecuzione il thread " + this.id); Thread.Sleep(1000); public static void Main(string[] args) { PrimoEsempioJoin primo = new PrimoEsempioJoin(0); PrimoEsempioJoin secondo = new PrimoEsempioJoin(1); Thread thread0 = new Thread(new ThreadStart(primo.Run)); Thread thread1 = new Thread(new ThreadStart(secondo.Run)); thread0.start(); thread1.start(); try { thread0.join(); thread1.join(); catch (ThreadInterruptedException) { System.Console.WriteLine("Main concluso"); 51 Tecniche di Programmazione: C# >> Thread Thread Sincronizzazione come per Java ci sono due sintassi Sintassi esplicita basata sulla classe System.Threading.Monitor Sintassi esplicita basata sulla parola chiave lock consente solo di acquisire e rilasciare blocchi 52

Tecniche di Programmazione: C# >> Thread Thread Sincronizzazione esplicita tutti gli oggetti di C# hanno un monitor implicito (lock implicito + condizione implicita) manipolabile utilizzando i metodi statici della classe Monitor sul riferimento all oggetto Monitor.Enter(<rif>): acquisisce il lock Monitor.Exit(<rif>): rilascia il lock Monitor.Wait(<rif>): si mette in attesa della cond. Monitor.PulseAll(<rif>): risveglia i thread in attesa 53 Tecniche di Programmazione: C# >> Thread Thread >> Unibas.BancaThread Il lock utilizzato è rientrante al solito è opportuno chiamare Monitor.Enter(this) prima di un try e Monitor.Exit(this) nel finally Monitor.Enter(this); try { // regione sincronizzata finally { Monitor.Exit(this); 54

Tecniche di Programmazione: C# >> Thread Thread La sintassi implicita utilizza la parola chiave lock lock (this) { // regione sincronizzata Monitor.Enter(this); try { // regione sincronizzata finally { Monitor.Exit(this); 55 Tecniche di Programmazione: C# >> Sommario Riassumendo Le API di.net Date Collezioni Ordinamento Clonazione e Serializzazione Classi Nidificate Thread 56

Termini della Licenza Termini della Licenza This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. Questo lavoro viene concesso in uso secondo i termini della licenza Attribution-ShareAlike di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. 57