JAVA JAVA Introduzione INTRODUZIONE C++ JDK e JRE API IDE (BLUEJ) Cross Platform DIAPOSITIVA 2 Web Dinamico Versioni e IDE ALESSANDRO URSOMANDO 1 JAVA La programmazione orientata agli oggetti JAVA La programmazione OOP Nascita della OOP NASCITA DELLA OOP 1970 Programmi Dati Algoritmo Sistema Programmazione strutturata DIAPOSITIVA 4 Programmazione OOP ALESSANDRO URSOMANDO 2 JAVA La programmazione OOP Classi e Oggetti CLASSI E OGGETTI Classe Cane Oggetto pabn Oggetto snoopy Oggetto scoobyDoo Oggetto pluto Oggetto spank DIAPOSITIVA 5 JAVA ALESSANDRO URSOMANDO La programmazione OOP Incapsulamento INCAPSULAMENTO - DIAPOSITIVA 6 ATTRIBUTI nome colori tipo amici dataNascita diFantasia abilita Classe Cane - METODI abbaia () scodinzola () mangia () gioca() ALESSANDRO URSOMANDO 3 JAVA La programmazione OOP Ereditarietà EREDITARIETÀ Classe Cane Classe Alano Classe Barboncino Classe Mastino Classe PT Classe Collie DIAPOSITIVA 7 JAVA ALESSANDRO URSOMANDO La programmazione OOP Polimorfismo POLIMORFISMO Classe PT Classe Cane Classe Collie commissarioRex DIAPOSITIVA 8 lassie ALESSANDRO URSOMANDO 4 JAVA La programmazione OOP Linguaggi LINGUAGGI Linguaggi puri Linguaggi ibridi DIAPOSITIVA 9 ALESSANDRO URSOMANDO JAVA La portabilità 5 JAVA Portabilità PORTABILITÀ Sistema Linux con JVM COMPILAZIONE Codice Sorgente “INTERPRETAZIONE” Bytecode Sistema MAC con JVM Java Runtime Enviroment (JVM e le librerie di classi) Compilatore ed altri strumenti Sistema WIN con JVM JDK DIAPOSITIVA 11 ALESSANDRO URSOMANDO JAVA BlueJ 6 JAVA BLUEJ BLUEJ IDE per sviluppare in Java Multi-Piattaforma Licenza GNU Kent University BlueJ DIAPOSITIVA 13 JAVA BLUEJ ALESSANDRO URSOMANDO Selezione JVM SELEZIONE JVM DIAPOSITIVA 14 ALESSANDRO URSOMANDO 7 JAVA BLUEJ Creazione di un progetto CREAZIONE PROGETTO Project New Project Raggiungi la posizione desiderata Digita il nome del progetto BlueJ crea una cartella con questo nome (che rappresenta il progetto) DIAPOSITIVA 15 JAVA BLUEJ ALESSANDRO URSOMANDO Creazione di una classe CREAZIONE CLASSE Pulsante <New Class> BlueJ crea un file con questo nome DIAPOSITIVA 16 ALESSANDRO URSOMANDO 8 JAVA BLUEJ Creazione di una classe per eseguire codice CREAZIONE CLASSE PER ESEGUIRE CODICE DIAPOSITIVA 17 JAVA BLUEJ ALESSANDRO URSOMANDO Creazione di una classe per eseguire codice CREAZIONE CLASSE PER ESEGUIRE CODICE DIAPOSITIVA 18 ALESSANDRO URSOMANDO 9 JAVA BLUEJ Creazione di una classe propriamente detta CREAZIONE CLASSE PROPRIAMENTE DETTA DIAPOSITIVA 19 JAVA BLUEJ ALESSANDRO URSOMANDO Creazione di un oggetto CREAZIONE OGGETTO DIAPOSITIVA 20 ALESSANDRO URSOMANDO 10 JAVA BLUEJ Creazione di un oggetto CREAZIONE OGGETTO DIAPOSITIVA 21 ALESSANDRO URSOMANDO JAVA Gli elementi del linguaggio 11 JAVA Gli elementi del Linguaggio Tipi di dato TIPI DI DATO TIPO BIT VALORI VALORI unsigned VALORE INIZIALE boolean 1 - - false char 16 byte 8 [-128; 127] 16 [-215; 215-1] 231-1] short unicode [0; 216-1] int 32 [-231; long 64 [-263; 263-1] - ‘\u0000’ [0; 255] 0 [0; 216-1 0 [0; 232-1] 0 [0; 264-1] 0 float 32 precisione singola 0.0 double 64 precisione doppia 0.0 void - - - DIAPOSITIVA 23 JAVA - ALESSANDRO URSOMANDO Gli elementi del Linguaggio Operatori OPERATORI OPERATORI SIGNIFICATO ++ -- Autoincremento / decremento + - * / % Aritmetici + Concatenazione == != > >= < <= Confronto && || ! Logici = Assegnazione += -= *= /= %= Assegnazione combinati . Accesso ai membri di un oggetto /*..*/ DIAPOSITIVA 24 /**..*/ //.. Commenti ALESSANDRO URSOMANDO 12 JAVA Gli elementi del Linguaggio Modificatori MODIFICATORI Modificatore Applicato a Significato unsigned attributi solo valori non negativi static attributi e metodi di classe (e non di ciascun oggetto) final attributi rende la variabile costante final classe rende la classe non estendibile metodo rende impossibile l’overriding del metodo final DIAPOSITIVA 25 JAVA ALESSANDRO URSOMANDO Gli elementi del Linguaggio Modificatori MODIFICATORI Modificatore Applicato a Significato public classi, attributi e metodi visibile da tutte le classi di tutti i package private classi, attributi e metodi visibile solo nella classe protected classi, attributi e metodi visibile a tutte le classi dello stesso package (sottoclassi comprese) package classi, attributi e metodi visibile a tutte le classi dello stesso package (sottoclassi escluse) abstract metodo è un metodo senza corpo abstract classe classe non istanziabile: impone a tutte le sottoclassi di implementare tutti i metodi astratti synchronized metodo è un metodo che accede a un dato da usare in mutua esclusione DIAPOSITIVA 26 ALESSANDRO URSOMANDO 13 JAVA Gli elementi del Linguaggio Istruzioni condizionali ISTRUZIONI CONDIZIONALI DIAPOSITIVA 27 JAVA Gli elementi del Linguaggio ALESSANDRO URSOMANDO Istruzioni condizionali ISTRUZIONI CONDIZIONALI DIAPOSITIVA 28 ALESSANDRO URSOMANDO 14 JAVA Gli elementi del Linguaggio Istruzioni Iterative ISTRUZIONI ITERATIVE DIAPOSITIVA 29 JAVA ALESSANDRO URSOMANDO Gli elementi del Linguaggio Variabili Reference VARIABILI REFERENCE DIAPOSITIVA 30 ALESSANDRO URSOMANDO 15 JAVA Metodi speciali JAVA Metodi Speciali Costruttori COSTRUTTORI Il costruttore è un metodo speciale che viene invocato da Java quando viene creata una nuova istanza di un oggetto (con l’operatore new). Si usa per inizializzare tutti gli attributi della classe Ha lo stesso nome della classe Costruttore Non restituisce niente Non può essere invocato esplicitamente DIAPOSITIVA 32 ALESSANDRO URSOMANDO 16 JAVA Metodi Speciali Finalizzatore FINALIZZATORE Sappiamo che dichiarare una variabile di un certo oggetto alloca spazio solo per il riferimento all’oggetto il quale verrà realmente allocato in memoria successivamente con l’operatore new. Il Garbage Collector conta i riferimenti ai vari oggetti allocati e quando il numero di riferimenti è zero libera la memoria Garbage Collector Prima di eliminare un oggetto dalla memoria Java invoca il metodo finalize(), che può essere usato per chiudere file, chiudere connessioni a DB, ecc. DIAPOSITIVA 33 JAVA Metodi Speciali ALESSANDRO URSOMANDO equals() EQUALS() DIAPOSITIVA 34 ALESSANDRO URSOMANDO 17 JAVA Metodi Speciali toString() TOSTRING() DIAPOSITIVA 35 ALESSANDRO URSOMANDO JAVA API e package 18 JAVA API e Package API E PACKAGE Un package è una libreria di classi. La gerarchia di package riflette la gerarchia a livello di file system. Package Per inserire una classe in un package non basta far risiedere il file che la definisce in una certa cartella, bisogna specificare: package <nome_package>; Quando in una classe si fa uso di classi di altri package, bisogna indicarlo: import <path_package>.*; DIAPOSITIVA 37 JAVA ALESSANDRO URSOMANDO API e Package API E PACKAGE Le API delle librerie standard di Java vengono fornite con il JRE e consentono l’indipendenza dal sistema. API Le API di Java coprono le esigenze base più disparate: dalla grafica alla gestione del multi-threading; dalle classi contenitore per i tipi base (più la classe String) alle classi per la gestione della programmazione su reti. http://download.oracle.com/javase/7/docs/api Documentazione Java 7 DIAPOSITIVA 38 ALESSANDRO URSOMANDO 19 JAVA Oveloading e Overriding JAVA Overloading ed Overriding OVERLOADING ED OVERRIDING Per overloading si intende la presenza – nella stessa classe – di più metodi con lo stesso nome ma con firme diverse. Overloading DIAPOSITIVA 40 ALESSANDRO URSOMANDO 20 JAVA Overloading ed Overriding OVERLOADING ED OVERRIDING Per overriding si intende la possibilità di riscrivere un metodo ereditato Overriding DIAPOSITIVA 41 ALESSANDRO URSOMANDO JAVA La documentazione 21 JAVA La Documentazione LA DOCUMENTAZIONE Java offre lo strumento javadoc che interpretando il codice opportunamente commentato genera la documentazione del progetto in HTML. javadoc Tools DIAPOSITIVA 43 JAVA In BlueJ si trova in: Project Documentation ALESSANDRO URSOMANDO La Documentazione DIAPOSITIVA 44 ALESSANDRO URSOMANDO 22 JAVA Gestione delle eccezioni JAVA Gestione delle eccezioni Sommario GESTIONE DELLE ECCEZIONI Classificazione degli errori La gerarchia delle classi Il blocco try-catch Propagazione dell’eccezione Metodi della classe Exception DIAPOSITIVA 46 ALESSANDRO URSOMANDO 23 JAVA Gestione delle eccezioni Classificazione degli errori CLASSIFICAZIONE DEGLI ERRORI I seguenti eventi possono generare l’arresto di un programma utente: • l’accesso a un vettore con un indice sbagliato • il tentativo di apertura di un file che fallisce • ecc. ecc. In questi casi il programma viene chiuso presentando a video un messaggio che riporta: - Il nome dell’errore - La linea di codice che ha generato l’errore - Lo stack dei metodi che hanno portato a quella linea di codice In alcune circostanze questo (spiacevole) comportamento si può evitare! DIAPOSITIVA 47 JAVA ALESSANDRO URSOMANDO Gestione delle eccezioni Classificazione degli errori CLASSIFICAZIONE DEGLI ERRORI Java separa gli errori irreparabili (definiti appunto errori) da quelli che Invece non compromettono il proseguimento del programma (definiti eccezioni). Un errore potrebbe essere il malfunzionamento fisico di un dispositivo di sistema. Un errore non può essere gestito. DIAPOSITIVA 48 Un’eccezione potrebbe essere il tentativo di eseguire una divisione per zero. In questi casi si può pensare di gestire la situazione. ALESSANDRO URSOMANDO 24 JAVA Gestione delle eccezioni Classificazione degli errori CLASSIFICAZIONE DEGLI ERRORI In un programma java quindi ci sono delle porzioni di codice che generano (sollevano) eccezioni e delle altre parti di codice che le gestiscono. Pertanto il programmatore nei confronti di una possibile eccezione può decidere di: - ignorarla - gestirla subito - gestirla altrove nel programma DIAPOSITIVA 49 JAVA Gestione delle eccezioni ALESSANDRO URSOMANDO La gerarchia delle classi LA GERARCHIA DELLE CLASSI Le eccezioni sono organizzate in una gerarchia di classi dove la classe base è la classe Exception che viene specializzata in un certo numero di sottoclassi. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/package-tree.html DIAPOSITIVA 50 ALESSANDRO URSOMANDO 25 JAVA Gestione delle eccezioni Il blocco try-catch IL BLOCCO TRY-CATCH Java permette di eseguire porzioni di codice potenzialmente pericoloso in un blocco try-catch. DIAPOSITIVA 51 JAVA ALESSANDRO URSOMANDO Gestione delle eccezioni Il blocco try-catch IL BLOCCO TRY-CATCH Nel blocco try inserisco il codice potenzialmente pericoloso che viene eseguito tutto o fino al sollevamento dell’eccezione. A seguire inserisco uno o più clausole catch: ogni clausola catch è in grado di catturare una singola eccezione o una famiglia di eccezioni. Se viene sollevata un’eccezione durante l’esecuzione del blocco try, si valutano in ordine tutti i catch: viene eseguito solo il blocco di codice del primo catch che è in grado di gestire l’eccezione verificatasi. E se l’eccezione verificatasi non è gestita da alcun catch? Che senso ha avere più catch? A seguire inserisco il blocco finally che viene sempre e comunque eseguito. DIAPOSITIVA 52 ALESSANDRO URSOMANDO 26 JAVA Gestione delle eccezioni Propagazione dell’eccezione PROPAGAZIONE DELL’ECCEZIONE Un catch è in grado di gestire una condizione anomala che si è verificata in un blocco try. Nel blocco try ci possono essere tante istruzioni e anche invocazioni di metodi. BLOCCO DI CODICE … … invoco il metodo x … … METODO x … … invoco il metodo y … … METODO y … … istruzione … … Qualora nell’esecuzione di un metodo venga sollevata un’eccezione e non venga gestita al suo interno, questa viene propagata al metodo chiamante. DIAPOSITIVA 53 JAVA Gestione delle eccezioni ALESSANDRO URSOMANDO Metodi della classe Exception METODI DELLA CLASSE EXCEPTION In un modulo catch viene – per definizione – resa disponibile un’istanza di una classe Exception o di una sua sottoclasse. Possiamo usare il metodo toString che mostra il messaggio di errore. Possiamo usare il metodo printStackTrace() – ereditato da Throwable – per stampare l’elenco dei metodi che non hanno gestito l’eccezione. DIAPOSITIVA 54 ALESSANDRO URSOMANDO 27 JAVA Classi astratte ed interfacce JAVA Classi Astratte e Interfacce Classi Astratte CLASSI ASTRATTE Un metodo è astratto quando viene dichiarato con il modificatore abstract che sta ad indicare quanto segue: 1) Il metodo è privo di implementazione 2) Tutte le sottoclassi devono implementare questo metodo Se una classe ha anche un solo metodo abstract è essa stessa una classe astratta. Metodi Astratti Una classe astratta non può essere istanziata ed obbliga tutte le sue sottoclassi ad implementare tutti i suoi metodi abstract. Una classe può essere dichiarata astratta anche se non ha alcun metodo astratto Classi Astratte DIAPOSITIVA 56 ALESSANDRO URSOMANDO 28 JAVA Classi Astratte e Interfacce Interfacce INTERFACCE Le interfacce sono il metodo con il quale Java implementa la ereditarietà multipla. Un’interfaccia è un contenitore simile a una classe ma che presenta qualche limitazione: 1) tutte le variabili (se ci sono) sono per definizione public static e final 2) tutti i metodi (se ci sono) sono per definizione abstract e public Le interfacce Una classe può implementare una o più interfacce (oltre che estendere una classe) in questo caso sarà obbligata ad implementare tutti i metodi delle interfacce. DIAPOSITIVA 57 JAVA ALESSANDRO URSOMANDO Classi Astratte e Interfacce Interfacce INTERFACCE Per esempio una classe che implementa l’interfaccia predefinita Comparable è tenuta a definire il metodo int compareTo (Object) il quale viene adoperato in presenza di operatori di confronto. DIAPOSITIVA 58 ALESSANDRO URSOMANDO 29 JAVA File e Flussi JAVA File e Flussi Sommario FILE E FLUSSI Introduzione ai flussi La gerarchia delle classi Concatenazione dei flussi Input da tastiera File di testo File di dati DIAPOSITIVA 60 ALESSANDRO URSOMANDO 30 JAVA File e Flussi Introduzione ai Flussi INTRODUZIONE AI FLUSSI Java gestisce tutte le operazioni di I/O con il concetto di flusso (stream in inglese) Connessione remota Tastiera Flusso di Input Programma File di dati Risorsa esterna DIAPOSITIVA 61 JAVA File e Flussi ALESSANDRO URSOMANDO Introduzione ai Flussi INTRODUZIONE AI FLUSSI Java gestisce tutte le operazioni di I/O con il concetto di flusso (stream in inglese) Connessione remota Flusso di Output Monitor Programma File di dati Risorsa esterna DIAPOSITIVA 62 ALESSANDRO URSOMANDO 31 JAVA File e Flussi Introduzione ai Flussi INTRODUZIONE AI FLUSSI Java gestisce tutte le operazioni di I/O con il concetto di flusso (stream in inglese) Un flusso di byte indica la trasmissione di dati strutturati Un flusso di caratteri indica la trasmissione di testi Flusso di byte Flusso di caratteri DIAPOSITIVA 63 JAVA ALESSANDRO URSOMANDO File e Flussi La gerarchia delle classi LA GERARCHIA DELLE CLASSI BufferedReader Reader InputStreamReader FileReader Object PrintWriter Writer Le classi per i flussi di caratteri OutputStreamWriter FileWriter FileInputStream InputStream ObjectInputStream Object FileOutputStream OutputStream Le classi per i flussi di byte DIAPOSITIVA 64 ObjectOutputStream ALESSANDRO URSOMANDO 32 JAVA File e Flussi Concatenazione di flussi CONCATENAZIONE DI FLUSSI In entrambe le gerarchie ci sono due classi per l’input e due classi per l’output. Le due classi forniscono due punti di vista sullo stesso tipo di flusso. Queste due classi di solito si usano insieme: una di seguito all’altra. Flusso Basso Livello Flusso Alto Livello BufferedReader Reader InputStreamReader FileReader Object PrintWriter Writer OutputStreamWriter Le classi per i flussi di caratteri FileWriter FileInputStream InputStream ObjectInputStream Object FileOutputStream OutputStream ObjectOutputStream Le classi per i flussi di byte DIAPOSITIVA 65 JAVA ALESSANDRO URSOMANDO File e Flussi Input da tastiera INPUT DA TASTIERA L’input da tastiera è visto come un flusso di caratteri che partono dallo standard input (tastiera) ed arrivano al programma. Tastiera Flusso di Input Programma BufferedReader Reader InputStreamReader FileReader Object PrintWriter Writer Le classi per i flussi di caratteri DIAPOSITIVA 66 OutputStreamWriter FileWriter ALESSANDRO URSOMANDO 33 JAVA File e Flussi Input da tastiera INPUT DA TASTIERA Con la classe InputStreamReader leggo i byte dallo standard input e li codifico in caratteri utilizzando un certo charset. La classe BufferedReader gestisce per noi un buffer in modo da fornire solo dati significati (si pensi al metodo readLine()). Tastiera InputStreamReader BufferedReader Programma BufferedReader Reader InputStreamReader FileReader Object PrintWriter Writer OutputStreamWriter Le classi per i flussi di caratteri DIAPOSITIVA 67 JAVA File e Flussi FileWriter ALESSANDRO URSOMANDO Input da tastiera INPUT DA TASTIERA Con la classe InputStreamReader leggo i byte dallo standard input e li codifico in caratteri utilizzando un certo charset. La classe BufferedReader gestisce per noi un buffer in modo da fornire solo dati significati (si pensi al metodo readLine()). Tastiera InputStreamReader BufferedReader Programma DIAPOSITIVA 68 ALESSANDRO URSOMANDO 34 JAVA File e Flussi File di testo FILE DI TESTO Flusso di Input File di testo Flusso di Output File di testo Programma Apertura in sovrascrittura (o creazione) in scrittura (o append) in lettura Chiusura Scrittura Lettura Cominciamo a studiare l’operazione di lettura. Operazioni sui file DIAPOSITIVA 69 JAVA File e Flussi ALESSANDRO URSOMANDO File di testo Lettura FILE DI TESTO: LETTURA Prima di tutto dobbiamo aprire il file in lettura. Flusso di Input File di testo Programma BufferedReader Reader InputStreamReader FileReader Object PrintWriter Writer Le classi per i flussi di caratteri DIAPOSITIVA 70 OutputStreamWriter FileWriter ALESSANDRO URSOMANDO 35 JAVA File e Flussi File di testo Lettura FILE DI TESTO: LETTURA Con la classe FileReader leggo i caratteri dal file. La classe BufferedReader gestisce per noi un buffer in modo da fornire solo dati significativi (si pensi al metodo readLine()). FileReader BufferedReader File di testo Programma BufferedReader Reader InputStreamReader FileReader Object PrintWriter Writer OutputStreamWriter Le classi per i flussi di caratteri DIAPOSITIVA 71 JAVA FileWriter ALESSANDRO URSOMANDO File e Flussi File di testo Lettura FILE DI TESTO: LETTURA Con la classe FileReader leggo i caratteri dal file. La classe BufferedReader gestisce per noi un buffer in modo da fornire solo dati significativi (si pensi al metodo readLine()). FileReader BufferedReader File di testo Programma DIAPOSITIVA 72 ALESSANDRO URSOMANDO 36 JAVA File e Flussi File di testo Scrittura FILE DI TESTO: SCRITTURA Prima di tutto dobbiamo aprire il file in scrittura. Flusso di Output File di testo Programma BufferedReader Reader InputStreamReader FileReader Object PrintWriter Writer OutputStreamWriter Le classi per i flussi di caratteri DIAPOSITIVA 73 JAVA FileWriter ALESSANDRO URSOMANDO File e Flussi File di testo Scrittura FILE DI TESTO: SCRITTURA Con la classe FileWriter scrivo fisicamente sul file. La classe PrintWriter fornisce metodi di scrittura evoluti come print() e println(). PrintWriter FileWriter File di testo Programma BufferedReader Reader InputStreamReader FileReader Object PrintWriter Writer Le classi per i flussi di caratteri DIAPOSITIVA 74 OutputStreamWriter FileWriter ALESSANDRO URSOMANDO 37 JAVA File e Flussi File di testo Scrittura FILE DI TESTO: SCRITTURA Con la classe FileWriter scrivo fisicamente sul file. La classe PrintWriter fornisce metodi di scrittura evoluti come print() e println(). PrintWriter FileWriter File di testo Programma DIAPOSITIVA 75 JAVA File e Flussi ALESSANDRO URSOMANDO File di testo Scrittura FILE DI TESTO: SCRITTURA DIAPOSITIVA 76 ALESSANDRO URSOMANDO 38 JAVA File e Flussi File di testo Scrittura FILE DI TESTO: SCRITTURA Le apertura in scrittura di un file consentono solo le due modalità indicate: - in sovrascrittura (creazione) - in append (aggiunta in coda) In nessun caso è possibile modificare o eliminare un valore archiviato in un file. DIAPOSITIVA 77 JAVA ALESSANDRO URSOMANDO File e Flussi File di testo File di testo per dati FILE DI TESTO PER DATI Possiamo inserire (e poi leggere) in un file di testo anche valori di tipo diverso. In lettura, una volta acquisita la stringa: “10;3.14”, possiamo separare i vari campi con uno strumento che si chiama StringTokenizer. DIAPOSITIVA 78 ALESSANDRO URSOMANDO 39 JAVA File e Flussi File di testo File di testo per dati FILE DI TESTO PER DATI È una classe del package java.util che separa una stringa in vari token separati da un delimitatore. hasMoreToken() restituisce true se ci sono altri token da estarre nextToken() restituisce il token attuale e si sposta su quello successivo StringTokenizer DIAPOSITIVA 79 JAVA ALESSANDRO URSOMANDO File e Flussi File strutturati FILE STRUTTURATI Flusso di Input File di dati Flusso di Output File di dati Programma Apertura in sovrascrittura (o creazione) in scrittura (o append) in lettura Chiusura Scrittura Lettura Cominciamo a studiare l’operazione di lettura. Operazioni sui file DIAPOSITIVA 80 ALESSANDRO URSOMANDO 40 JAVA File e Flussi File strutturati Lettura FILE STRUTTURATI: LETTURA Prima di tutto dobbiamo aprire il file in lettura. Flusso di Input File di dati Programma FileInputStream InputStream ObjectInputStream Object FileOutputStream OutputStream ObjectOutputStream Le classi per i flussi di byte DIAPOSITIVA 81 JAVA ALESSANDRO URSOMANDO File e Flussi File strutturati Lettura FILE STRUTTURATI: LETTURA Con la classe FileInputStream leggo i byte dal file. La classe ObjectInputStream formatta questi dati nel tipo richiesto: fornisce infatti metodi come readInt(), readDouble(), readBool() e anche readObject() (per gli oggetti). FileInputStream ObjectInputStream File di dati Programma FileInputStream InputStream ObjectInputStream Object FileOutputStream OutputStream Le classi per i flussi di byte DIAPOSITIVA 82 ObjectOutputStream ALESSANDRO URSOMANDO 41 JAVA File e Flussi File strutturati Lettura FILE STRUTTURATI: LETTURA Con la classe FileInputStream leggo i byte dal file. La classe ObjectInputStream formatta questi dati nel tipo richiesto: fornisce infatti metodi come readInt(), readDouble(), readBool() e anche readObject() (per gli oggetti). FileInputStream ObjectInputStream File di dati Programma FileInputStream InputStream ObjectInputStream Object FileOutputStream OutputStream ObjectOutputStream Le classi per i flussi di byte DIAPOSITIVA 83 JAVA ALESSANDRO URSOMANDO File e Flussi File strutturati Scrittura FILE STRUTTURATI: SCRITTURA Prima di tutto dobbiamo aprire il file in scrittura. Flusso di Output File di dati Programma FileInputStream InputStream ObjectInputStream Object FileOutputStream OutputStream Le classi per i flussi di byte DIAPOSITIVA 84 ObjectOutputStream ALESSANDRO URSOMANDO 42 JAVA File e Flussi File strutturati Scrittura FILE STRUTTURATI: SCRITTURA Con la classe FileOutputStream scrivo fisicamente sul file. La classe ObjectOutputStream fornisce metodi come writeInt(), writeDouble(), writeBool() e anche writeObject() (per gli oggetti). ObjectOutputStream FileOutputStream File di testo Programma FileInputStream InputStream ObjectInputStream Object FileOutputStream OutputStream Le classi per i flussi di byte ObjectOutputStream DIAPOSITIVA 85 JAVA ALESSANDRO URSOMANDO File e Flussi File strutturati Scrittura FILE STRUTTURATI: SCRITTURA Con la classe FileOutputStream scrivo fisicamente sul file. La classe ObjectOutputStream fornisce metodi come writeInt(), writeDouble(), writeBool() e anche writeObject() (per gli oggetti). ObjectOutputStream FileOutputStream File di testo Programma DIAPOSITIVA 86 ALESSANDRO URSOMANDO 43 JAVA File e Flussi File strutturati Scrittura FILE STRUTTURATI: SCRITTURA La classe UnaClasseQualsiasi – per potere essere usata come argomento di writeObject() – deve implementare l’interfaccia Serializable. DIAPOSITIVA 87 ALESSANDRO URSOMANDO JAVA Gestione del Multithreading 44 JAVA Gestione del Multi-threading Introduzione MULTI-THREADING Con il termine thread (processo leggero) si indicano le varie trame (o filoni) di un processo. Thread Supponiamo per esempio che un processo avvii un nuovo thread per farsi aiutare nel portare avanti un lavoro. DIAPOSITIVA 89 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading Introduzione MULTI-THREADING Con il termine thread (processo leggero) si indicano le varie trame (o filoni) di un processo. Thread Un processo (o anche un thread) può avviare un numero imprecisato di thread. DIAPOSITIVA 90 ALESSANDRO URSOMANDO 45 JAVA Gestione del Multi-threading Introduzione MULTI-THREADING Con il termine thread (processo leggero) si indicano le varie trame (o filoni) di un processo. Thread Inoltre un processo potrebbe anche avviare più thread e poi morire. DIAPOSITIVA 91 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading Introduzione MULTI-THREADING Con il termine thread (processo leggero) si indicano le varie trame (o filoni) di un processo. Thread Ovviamente non tutti i thread devono completare il lavoro loro assegnato contemporanemente DIAPOSITIVA 92 ALESSANDRO URSOMANDO 46 JAVA Gestione del Multi-threading Introduzione MULTI-THREADING Con il termine thread (processo leggero) si indicano le varie trame (o filoni) di un processo. Thread Il multi-threading può essere adoperato quando un processo deve svolgere diverse attività in contemporanea. Multi-threading Per esempio, quando si esegue un programma Java, in realtà si lancia il processo della JVM (java.exe) il quale lancia diversi thread: il gestore degli eventi utili alla grafica, il garbage collector, il programma utente java mandato in esecuzione, ecc. DIAPOSITIVA 93 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading Informazioni sul thread corrente INFORMAZIONI SUL THREAD CORRENTE ESERCIZIO 00-00-04-13 Cominciamo ad imparare come leggere e modificare informazioni relative al thread del programma in esecuzione DIAPOSITIVA 94 ALESSANDRO URSOMANDO 47 JAVA Gestione del Multi-threading La classe Thread LA CLASSE THREAD E se volessimo avviare un thread dal main? Una strada è quella di creare una nuova classe che deriva da Thread Una sottoclasse di Thread deve fare overriding del metodo run() che viene invocato dalla JVM all’avvio del thread e contiene il lavoro del thread Una volta istanziata la classe possiamo avviare il thread (metodo start), fermarlo (metodo stop), e/o distruggerlo (metodo destroy). DIAPOSITIVA 95 JAVA Gestione del Multi-threading ALESSANDRO URSOMANDO La classe Thread Un esempio monothread Margherita: i costruttori ESERCIZIO 00-00-03-14 MARGHERITA: I COSTRUTTORI DIAPOSITIVA 96 ALESSANDRO URSOMANDO 48 JAVA Gestione del Multi-threading La classe Thread Un esempio monothread Margherita: il metodo run() ESERCIZIO 00-00-03-14 MARGHERITA: IL METODO RUN() DIAPOSITIVA 97 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading La classe Thread Un esempio monothread Margherita: uso numero 1 ESERCIZIO 00-00-03-14 MARGHERITA: USO #1 DIAPOSITIVA 98 ALESSANDRO URSOMANDO 49 JAVA Gestione del Multi-threading La classe Thread Un esempio monothread Margherita: uso numero 2 ESERCIZIO 00-00-03-14 MARGHERITA: USO #2 DIAPOSITIVA 99 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading La classe Thread Un esempio monothread Margherita: uso numero 3 ESERCIZIO 00-00-03-14 MARGHERITA: USO #3 DIAPOSITIVA 100 ALESSANDRO URSOMANDO 50 JAVA Gestione del Multi-threading La classe Thread Un esempio multi-thread Margherita MARGHERITA E se volessimo avviare più thread dal main? Modifichiamo l’esempio in modo che ogni thread stampi il suo output in una certa colonna a se’ intestata. DIAPOSITIVA 101 JAVA Gestione del Multi-threading ALESSANDRO URSOMANDO La classe Thread Un esempio multi-thread Margherita: i costruttori ESERCIZIO 00-00-03-15 MARGHERITA: I COSTRUTTORI DIAPOSITIVA 102 ALESSANDRO URSOMANDO 51 JAVA Gestione del Multi-threading La classe Thread Un esempio multi-thread Margherita: il metodo run() ESERCIZIO 00-00-03-15 MARGHERITA: IL METODO RUN() DIAPOSITIVA 103 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading La classe Thread Un esempio multi-thread Margherita: uso numero 1 ESERCIZIO 00-00-03-15 MARGHERITA: USO #1 DIAPOSITIVA 104 ALESSANDRO URSOMANDO 52 JAVA Gestione del Multi-threading La classe Thread Un esempio multi-thread Margherita: uso numero 2 ESERCIZIO 00-00-03-15 MARGHERITA: USO #2 DIAPOSITIVA 105 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading La classe Thread Un esempio multi-thread Margherita: uso numero 3 ESERCIZIO 00-00-03-15 MARGHERITA: USO #3 DIAPOSITIVA 106 ALESSANDRO URSOMANDO 53 JAVA Gestione del Multi-threading La classe Thread Un esempio multi-thread Margherita: uso numero 4 ESERCIZIO 00-00-03-15 MARGHERITA: USO #4 DIAPOSITIVA 107 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading La classe Thread Un esempio multi-thread Margherita: uso numero 5 MARGHERITA: USO #5 ESERCIZIO 00-00-03-15 Se imposto ad un valore casuale la quantità di tempo che un thread deve aspettare prima di passare al petalo successivo ottengo un interfogliamento meno banale. DIAPOSITIVA 108 ALESSANDRO URSOMANDO 54 JAVA Gestione del Multi-threading L’interfaccia Runnable L’INTERFACCIA RUNNABLE L’ereditarietà multipla in Java si ottiene con le interfacce. E se la mia classe – thread è già sottoclasse di qualcun altro ? Una classe che implementa l’interfaccia Runnable è tenuta a implementare il metodo run(). Un oggetto di una siffatta classe può essere abbinato ad un oggetto della classe Thread. Runnable La classe Thread ha – tra gli altri – un costruttore che prende come argomento un riferimento ad un oggetto che implementi l’interfaccia Runnable. Il riferimento all’oggetto stesso this è un riferimento valido in tal senso. DIAPOSITIVA 109 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading L’interfaccia Runnable un esempio multi-thread Margherita Runnable: attributi e costruttore MARGHERITA RUNNABLE: ESERCIZIO 00-00-04-16 ATTRIBUTI E COSTRUTTORE DIAPOSITIVA 110 ALESSANDRO URSOMANDO 55 JAVA Gestione del Multi-threading L’interfaccia Runnable un esempio multi-thread Margherita Runnable: gli altri costruttori MARGHERITA RUNNABLE: ESERCIZIO 00-00-04-16 GLI ALTRI COSTRUTTORI DIAPOSITIVA 111 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading L’interfaccia Runnable un esempio multi-thread Margherita Runnable: i metodi da inoltrare MARGHERITA RUNNABLE: I METODI DA INOLTRARE ESERCIZIO 00-00-04-16 Il metodo run() non subisce modifche DIAPOSITIVA 112 ALESSANDRO URSOMANDO 56 JAVA Gestione del Multi-threading L’interfaccia Runnable un esempio multi-thread Margherita Runnable: usi numeri 1 e 2 MARGHERITA RUNNABLE: USI #1 E #2 ESERCIZIO 00-00-04-16 Questa classe Margherita può essere utilizzata esattamente come quella precedente che estendeva Thread. DIAPOSITIVA 113 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading L’interfaccia Runnable un esempio multi-thread Margherita Runnable: uso numero 3 MARGHERITA RUNNABLE: USO #3 ESERCIZIO 00-00-04-16 Questa classe Margherita può essere utilizzata esattamente come quella precedente che estendeva Thread. DIAPOSITIVA 114 ALESSANDRO URSOMANDO 57 JAVA Gestione del Multi-threading L’interfaccia Runnable un esempio multi-thread Margherita Runnable: uso numero 4 MARGHERITA RUNNABLE: USO #4 ESERCIZIO 00-00-04-16 Questa classe Margherita può essere utilizzata esattamente come quella precedente che estendeva Thread. DIAPOSITIVA 115 JAVA ALESSANDRO URSOMANDO Gestione del Multi-threading L’interfaccia Runnable Altri usi possibili ALTRI USI DI RUNNABLE Abbiamo dichiarato un oggetto di tipo Thread nella classe Margherita e inoltrato alcuni metodi tipici. Alternativamente a ciò si potrebbe: • Scrivere il solo metodo run() nella classe che implementa Runnable • Nel main (o altrove) • istanziare un oggetto di questa classe • istanziare un oggetto di tipo Thread al quale si lega l’oggetto appena istanziato • fare uso dei metodi start(), stop(), getName(), ecc, dell’oggetto di tipo Thread Questa soluzione induce a produrre un codice meno pulito ma in alcuni casi può risultare utile DIAPOSITIVA 116 ALESSANDRO URSOMANDO 58 MUTUA ESCLUSIONE Quando un dato deve essere usato in mutua esclusione da Thread diversi, i metodi che accedono a questo dato devono essere dichiarati con il modificatore synchronized Posti Disponibili Operatore Utente 2 DIAPOSITIVA 117 JAVA ESERCIZIO 00-00-03-20 Utente 1 ALESSANDRO URSOMANDO Gestione del Networking NETWORKING 401 144 DIAPOSITIVA 118 ALESSANDRO URSOMANDO 59