Thread in Java CAPITOLO Richiami di gestione di processi

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Thread in Java CAPITOLO 18. 18.1 Richiami di gestione di processi"

Transcript

1 CAPITOLO 18 Thread in Java Usualmente l esecuzione di un programma è sostenuta da un processo. Nella terminologia Java i processi sono denominati thread. Un thread è dunque costituito da un flusso di esecuzione di istruzioni. In molti casi è opportuno disporre di architetture software di tipo multi-thread, sia perché il calcolatore utilizzato può disporre di hardware dotato di più processori, ed essere pertanto in grado di effettuare computazioni indipendenti, sia perché la risoluzione di un particolare problema può essere organizzata in più sottoproblemi paralleli parzialmente separabili e autonomi. Si sottolinea in particolare che nella macchina virtuale di Java, nel seguito denominata JVM, la gestione dei frame costituenti l interfaccia grafica e delle operazioni che in essi hanno luogo è demandata a thread separati, uno per ciascun frame Richiami di gestione di processi Architetture software basate sull esistenza di processi indipendenti sono attuabili in ogni calcolatore purché il suo sistema operativo lo consenta. Ciò avviene in particolare con macchine dotate di sistemi operativi multitasking. In questi sistemi più processi possono coesistere ed interagire tra di loro scambiandosi reciprocamente informazioni. Dal punto di vista del sistema operativo non vi è alcuna differenza sostanziale tra il trattamento dei processi utente e quello dei processi di sistema. Va tuttavia rilevato che la gestione dei processi nei sistemi multitasking è piuttosto delicata, essendo mirata ad ottimizzare le risorse del sistema nella sua globalità. Ciò comporta, in particolare, che la computazione effettuata dai processi attivi nel calcolatore possa essere temporaneamente sospesa o subire modificazioni nella priorità di esecuzione, sia in base alle operazioni definite nei processi medesimi sia in forza di specifiche politiche di gestione previste dal sistema operativo. Con riferimento all ultima osservazione svolta, si consideri che in un sistema multitasking ogni processo può trovarsi sempre in uno solo di tre stati: esecuzione, attesa oppure pronto. In ogni istante un solo processo è in esecuzione, mentre più processi possono trovarsi accodati

2 18 CAPITOLO 18 Figura 18.1 Grafo di transizione tra gli stati di un processo. negli altri stati. Tipicamente il passaggio di un processo da uno stato ad un altro è conseguenza di richieste di operazioni di I/O oppure di completamento di quest ultime. È peraltro possibile che un processo si sospenda autonomamente o venga sospeso al fine di sincronizzarlo con altro processo concorrente. La Figura 18.1 evidenzia il grafo di transizione per gli stati di un processo. Appena creato, il processo è collocato nella coda dei processi pronti, dalla quale è fatto passare in esecuzione dal sistema operativo. Dallo stato di esecuzione il processo può: (a) terminare, venendo rimosso dalla lista dei processi; (b) venire sospeso a seguito di una richiesta di I/O oppure di accesso ad altra risorsa e venire inserito nella coda dei processi in attesa sino a quando tale risorsa non sarà disponibile; (c) venire sospeso su richiesta di altro processo o del sistema operativo ed essere trasferito nella coda dei processi pronti sino a quando non verrà richiesta la sua riattivazione. Dalla coda di attesa il processo viene rimosso in seguito al completamento dell operazione di I/O oppure per essersi liberata la risorsa richiesta, venendo inserito nella lista dei processi pronti per continuare l esecuzione. Nella gestione d insieme dei processi vi sono alcuni aspetti che si presentano critici. Uno di essi, di particolare interesse per gli argomenti trattati nel testo, riguarda la sincronizzazione per l interscambio di dati e la conseguente possibilità di mutua sospensione e successiva riattivazione. Le problematiche connesse non verranno tuttavia trattate nella loro generalità, ma facendo esplicito riferimento all architettura della macchina virtuale di Java I thread di Java In Java i processi vengono chiamati thread e costituiscono dei flussi di esecuzione. Si è già fatto notare che ogni frame è associato ad un proprio thread, il quale è responsabile delle computazioni operate a livello di finestra. Più in generale va detto che la JVM è basata su un architettura multi-thread per la cui gestione è fornita la classe Thread afferente al package java.lang. Il modello di processi usato dalla classe è improntato agli assunti sotto indicati. Ogni oggetto thread è depositario di un identificatore, non necessariamente univoco, il cui uso è limitato ad eventuali operazioni di debugging dell applicazione. Usualmente tale identificatore non è di alcuna utilità nelle applicazioni.

3 THREAD IN JAVA 19 Ogni thread afferisce ad un thread group. L insieme dei gruppi di thread presenti nella macchina Java costituisce una struttura ad albero, con radice data dal system thread group, della cui gestione è responsabile il sistema. Ogni thread possiede una priorità di esecuzione, che è costituita da un numero intero compreso tra 1 e 10 assegnabile al thread in fase di programmazione. Un thread può assumere la connotazione di demone. I demoni peraltro costituiscono processi particolari, le proprietà funzionali dei quali non sono qui trattate in quanto esulano dagli scopi del testo. Per quanto concerne gli stati dei thread la JVM fa proprio il seguente modello: un thread è definito attivo nel caso in cui sia stata lanciata la sua esecuzione e questa non si è ancora completata; è definito inattivo in caso contrario; un thread è definito sospeso nel caso in cui la sua esecuzione sia stata temporaneamente interrotta; lo stato di sospensione potrà essere successivamente eliminato ripristinandone l esecuzione. Tutte le trasformazioni di stato di un thread sono effettuate a seguito dell attivazione di opportuni metodi della classe Thread. Prima di analizzare in dettaglio tali metodi sembra tuttavia opportuno puntualizzare quali siano le più significative funzionalità da essi espletate sui thread: allocazione e inizializzazione: coincide con la creazione dell oggetto della classe Thread che dovrà contenere il modello computazionale del thread e con la definizione del contesto in cui dovrà essere eseguito il processo; in tale fase il thread è inattivo; attivazione: causa l inizio della computazione di pertinenza del thread; il thread diviene attivo; sospensione: causa una (temporanea) interruzione dell esecuzione del thread; il thread passa nello stato di thread attivo ma sospeso; ripristino: causa la riattivazione dell esecuzione del thread sospeso; il thread ritorna nello stato attivo; terminazione forzata: causa una fine anomala nell esecuzione del thread; il thread ritorna nello stato inattivo; distruzione: causa la deallocazione del thread, senza che ciò comporti necessariamente il rilascio delle risorse da esso impegnate. I metodi forniti dalla classe Thread per fronteggiare le operazioni indicate permettono di gestire nel tempo l evoluzione dei singoli thread nella macchina virtuale di Java, ma non intervengono in alcun modo sul modello computazionale da questi sostenuto. Al fine di permettere al programmatore di definire il codice dei propri thread il linguaggio mette a disposizione il metodo run(), definito nell interfaccia Runnable e implementato dalla classe Thread. Tale metodo viene richiamato in fase di attivazione del thread ed è pertanto destinato ad essere riscritto, nelle sottoclassi d applicazione derivate da Thread, con il codice che è proprio del processo computazionale che si intende associare a quest ultime. Nel seguito sono riportati i metodi della classe Thread che rivestono maggior interesse per le applicazioni sviluppate in questo testo.

4 20 CAPITOLO 18 Il primo gruppo di metodi è destinato alla creazione dei thread e alla descrizione del modello computazionale da essi realizzato. Si tratta di metodi di largo impiego da usare ogniqualvolta un thread debba essere implementato. Thread Thread() Thread (Runnable target) void run() Il costruttore Thread() alloca un nuovo thread assegnandogli un identificatore del tipo Thread-n, in cui n è un numero naturale progressivo: tipicamente Thread-0 rappresenta il thread associato al metodo main(). Usato nella sua prima forma, il costruttore è riferito a thread istanziati da sottoclassi della classe Thread, mentre nella seconda forma è riferito a thread costituiti da istanze di classi che implementano l interfaccia Runnable. Il metodo run() permette di specificare il modello computazionale del thread. Se il thread è costruito a partire da una classe implementante l interfaccia Runnable, il metodo run() della classe Thread richiama l omonimo metodo dell oggetto Runnable. Se il thread si origina da una sottoclasse di Thread, tale sottoclasse deve riscrivere il metodo run() della classe Thread. Il gruppo di metodi che seguono permette di definire le priorità e la natura dei thread. Thread void setpriority (int newpriority) int getpriority() void setdaemon (boolean on) boolean isdaemon() Il metodo setpriority() permette di modificare la priorità di un thread. Il valore di priorità assegnato coincide con il minore tra il valore del parametro newpriority e il valore di priorità del thread group a cui il thread appartiene. Viceversa, il metodo get- Priority() restituisce il valore di priorità del thread. Il metodo setdaemon() permette di definire un thread come demone o meno. Il metodo deve essere invocato prima dell attivazione del thread. La JVM termina la sua attività quando i soli thread attivi sono costituiti da demoni. Il metodo isdaemon() permette di controllare se il thread a cui è inoltrato l omonimo messaggio è un thread demone o meno. Quattro metodi erano destinati nella prima versione di Java alla realizzazione delle principali operazioni di cambiamento di stato dei thread che sono state analizzate in precedenza.

5 THREAD IN JAVA 21 Thread void start() void suspend() void resume() void stop() boolean isalive() Il metodo start() induce l esecuzione del thread portandolo nello stato di thread attivo. La macchina virtuale Java richiama il metodo run() del thread. Il metodo suspend() causa la sospensione del thread portandolo nello stato di thread sospeso. L esecuzione del thread potrà essere successivamente ripristinata con il metodo resume(). Il metodo può essere interessato da un eccezione di tipo SecurityException. Il metodo resume() ripristina l esecuzione del thread qualora esso si trovi nello stato di thread attivo ma sospeso. Il metodo può essere interessato da un eccezione di tipo SecurityException. Il metodo stop() forza il thread ad interrompere in modo anomalo la propria esecuzione sollevando un eccezione ThreadDeath. L eccezione deve essere fatta rimbalzare al metodo chiamante perché il thread termini correttamente. Lo stato di attività dei thread è verificabile ricorrendo al metodo isalive(); il metodo controlla se il thread è attivo, ossia se su di esso è stato invocato il metodo start() e il thread non ha ancora raggiunto lo stato di terminazione. I metodi suspend(), resume() e stop() sono stati peraltro rimossi (dichiarati deprecated) nelle versioni successive del linguaggio, in quanto rivelatisi possibili cause di situazioni di deadlock. La sospensione di un thread o la sua terminazione vanno quindi gestite esclusivamente con i metodi del gruppo sotto indicato. Thread static Thread currentthread() static void yield() static void sleep (long millis) void join() Il metodo currentthread() restituisce un riferimento al thread correntemente in esecuzione. È principalmente utilizzato per acquisire informazioni sul thread. Il metodo yield() causa la temporanea sospensione del thread corrente, permettendo ad altri thread in attesa di divenire attivi. Il metodo sleep() causa la sospensione del thread per il numero di millisecondi indicato dal parametro millis. Il metodo join() induce il completamento del thread corrente prima di rendere possibile l attivazione del thread successivo.

6 22 CAPITOLO 18 Due metodi sono infine destinati alle operazioni di deallocazione dei thread. Thread void destroy() private void exit() Il metodo destroy() causa la deallocazione del thread, ma non delle risorse da esso impegnate. Il metodo exit() è usato dal sistema per permettere al thread di effettuare la deallocazione delle proprie risorse Creazione di thread La creazione di un thread può essere espletata in Java seguendo due metodologie: per ereditarietà dalla classe Thread; implementando l interfaccia Runnable. La scelta di una soluzione o dell altra è dettata da preferenze personali e dalle caratteristiche dell applicazione Creazione di sottoclassi Thread Qualora si voglia realizzare un thread sfruttando l omonima classe, è necessario effettuare le seguenti operazioni: costruire una sottoclasse della classe Thread; sovrascrivere il metodo run(). Il metodo run() della sottoclasse fornisce in tal modo il corpo del nuovo thread. Una volta generata la sottoclasse, è possibile: creare un thread per istanza della sottoclasse di pertinenza; eseguire il thread per chiamata del metodo start(), il quale invoca a sua volta il metodo run() Implementazione dell interfaccia Runnable Questa seconda soluzione è preferibile nel caso in cui si vogliano creare thread evitando situazioni che potrebbero condurre a forme di ereditarietà multipla, non ammessa da Java. Le operazioni necessarie sono le seguenti: costruzione di una classe di implementazione per l interfaccia Runnable; sovrascrittura del metodo run(). Anche in questa situazione il metodo run() della classe fornisce il corpo del nuovo thread. Ciò fatto, un thread viene creato: generando un istanza della classe che implementa Runnable; passando tale istanza come parametro del costruttore della classe Thread. Il thread è eseguito per chiamata del metodo start().

7 THREAD IN JAVA Sincronizzazione dei metodi In un sistema multi-thread coesistono in generale molti thread attivi, i quali costituiscono processi in grado di evolvere autonomamente e capaci di inoltrarsi reciprocamente messaggi. La ricezione di un messaggio da parte di un thread comporta l attivazione del metodo corrispondente. Sono dunque possibili situazioni in cui potrebbe essere richiesta la contemporanea esecuzione di due o più metodi di uno stesso thread: uno di essi eseguito per esigenza del thread depositario del metodo, gli altri perché invocati da messaggi inoltrati da thread diversi. Tale situazione può dimostrarsi estremamente critica, dal momento che la richiesta di esecuzione di metodi da thread esterni potrebbe interferire con l esecuzione della computazione del thread destinatario dei messaggi. Se infatti esistono situazioni in cui l alternata esecuzione dei metodi in questione da parte della JVM può essere opportuna, esistono sicuramente situazioni in cui tale alternanza va impedita. Il problema evidenziato è risolvibile fornendo il linguaggio di opportuni dispositivi per la sincronizzazione dei metodi. Sincronizzare due o più metodi, in sostanza, significa garantire che l esecuzione di ciascuno di essi non venga interrotta dall esecuzione dei rimanenti, neppure in caso di temporanea sospensione del thread a cui i metodi appartengono. In Java la sincronizzazione dei metodi è ottenuta mediante l uso del modificatore synchronized. Qualora i metodi di un thread siano dichiarati sincronizzati, l attivazione di uno di essi blocca le richieste di esecuzione dei metodi rimanenti quando inoltrate alla stessa istanza di thread. La situazione è descritta in Figura 18.2, in cui il thread thd1 è istanziato dalla classe ClasseDiThread e attivato con l esecuzione del metodo m1(). Il thread thd2, che inoltra il messaggio thd1.m2(), dovrà attendere il completamento di m1() per ottenere l esecuzione del metodo m2(). Quanto sopra asserito si applica ai metodi d istanza. Il modificatore synchronized può tuttavia essere applicato anche ai metodi di classe. Qualora due o più metodi statici sincronizzati di una stessa classe vengano chiamati da thread diversi, le loro esecuzioni subiscono un processo di serializzazione in modo che nessuno di essi possa essere interrotto dall esecuzione dei rimanenti. Figura 18.2 Sincronizzazione di metodi d istanza.

8 24 CAPITOLO Un esempio di sincronizzazione di metodi La classe Frame_xThread (Scheda 18.4a) fornisce un esempio di sincronizzazione di metodi secondo un modello produttore-consumatore. Si supponga di disporre di otto dischi blu posizionati nella regione di sinistra di un frame, come indicato in Figura 18.3 (a), e di voler raggiungere la configurazione di otto dischi rossi riportata in 18.3 (b). La trasformazione deve avvenire per produzione di dischi blu da rendere disponibili per la trasformazione in corrispondenti dischi rossi. Figura 18.3 Configurazioni iniziale e finale di un frame. Il processo che sottende la trasformazione delle configurazioni è basato su due metodi principali: il metodo produci() e il metodo consuma(). L esempio ha la funzione di mostrare la differenza tra le configurazioni intermedie, necessarie al raggiungimento di quella finale, che possono essere attraversate a seconda che i due metodi citati siano dichiarati synchronized o meno. Le due regioni di tracciatura in cui è suddivisa la finestra grafica sono rispettivamente denominate rgnprod e rgncons, a rappresentazione dello stato del thread causato dai metodi produci() e consuma(): il metodo produci()opera sulla regione rgnprod: esso riduce progressivamente di un unità il numero di dischi presenti nella regione, richiede la tracciatura della nuova configurazione della stessa e si sospende per un secondo; il metodo consuma() opera in modo analogo sulla regione rgncons, incrementando progressivamente di un unità il numero di dischi della regione, richiedendo la tracciatura della nuova configurazione raggiunta e sospendendosi per uno stesso periodo temporale. La sospensione del thread è inserita sia per permettere all osservatore di seguire l evoluzione del processo di trasformazione nella distribuzione dei dischi nelle due regioni, sia per rendere palese il diverso funzionamento dell applicazione quando i metodi produci() e consuma() sono entrambi dichiarati sincronizzati rispetto a quando non lo sono.

9 THREAD IN JAVA 25 La trasformazione complessiva delle configurazioni di dischi nelle due regioni di tracciatura del frame proviene dalla coordinata esecuzione di entrambi i metodi produci() e consuma(). A tale scopo è necessario che l applicazione a ciò preposta generi un thread, lo si denomini th1, da attivare con il comando th1.start() per l esecuzione del metodo consuma() e in seguito invochi il metodo produci() dello stesso thread. Lo schema computazionale complessivamente ottenuto è analogo a quello riportato in Figura 18.2: il thread thd1 con il metodo m1() è sostituito dal thread th1 e dal metodo consuma(), mentre il thread esterno thd2 inoltrante il messaggio thd1.m2() è sostituito dal thread contenente il programma main() dell applicazione e dal messaggio produci(). Le configurazioni ottenute lanciando l applicazione sono diverse a seconda che i metodi produci() e consuma() siano o meno dichiarati entrambi sincronizzati. Nel caso in cui entrambi i metodi siano dichiarati synchronized, il metodo produci(), che è in esecuzione appartenendo al thread del metodo main(), non può essere interrotto neppure nei suoi periodi di sospensione dal metodo consuma() del thread th1. Pertanto inizialmente si assisterà ad una successiva rimozione di dischi dalla regione rgnprod, come riportato in Figura 18.4, sino al raggiungimento della configurazione di Figura Soltanto a questo punto potrà essere attivato il metodo consuma() del thread th1, il quale procederà ad inserire dischi nella regione rgncons, generando la successione di configurazioni di Figura Figura 18.4 Configurazioni parziali generate dal metodo produci().

10 26 CAPITOLO 18 Figura 18.5 Configurazione finale generata dal metodo produci(). Figura 18.6 Configurazioni generate dal metodo consuma(). Qualora uno dei due metodi non sia dichiarato synchronized, produci() e consuma() procederanno autonomamente, alternandosi nella generazione di configurazioni parziali. Il risultato sarà di assistere ad una progressiva eliminazione di dischi blu dalla regione rgnprod e al contestuale inserimento di dischi rossi in rgncons.

11 THREAD IN JAVA 27 Figura 18.7 Configurazioni generate dai metodi produci() e consuma(). Scheda 18.4a - class Argomenti class Frame_xThread Sincronizzazione di metodi su una stessa istanza di thread. Modello implementato: produttore-consumatore. import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.*; import javax.swing.*;

12 28 CAPITOLO 18 public class Frame_xThread extends JFrame implements Runnable { private final int ncmax = 8; private final int r2 = 20; private PanThread rgnprod, rgncons; private int cinit_prod = ncmax, cinit_cons = 0; private int cbasex = 20; private int cbasey = 20; public Frame_xThread() { setdefaultcloseoperation (JFrame.EXIT_ON_CLOSE); Container cnt = getcontentpane(); cnt.setbackground (Color.white); cnt.setlayout (new BorderLayout()); settitle ( Produttore - Consumatore ); setbounds (30, 30, 700, 200); rgnprod = new PanThread (cinit_prod); rgnprod.setsize (340, 200); rgnprod.setbackground (Color.yellow); rgnprod.setforeground (Color.blue); cnt.add (rgnprod, West ); rgncons = new PanThread (cinit_cons); rgncons.setsize (340, 200); rgncons.setbackground (Color.cyan); rgncons.setforeground (Color.red); cnt.add (rgncons, East ); Panel controlli = new JPanel(); controlli.setbackground (Color.lightGray); cnt.add (controlli, South ); setvisible (true true); class PanThread extends Canvas { public int ncerchi; public PanThread (int ncerchi) { super(); this.ncerchi = ncerchi; public void paint (Graphics g) { int cx = cbasex; int cy = cbasey; Graphics2D g2 = (Graphics2D) g; for (int c = 0; c < ncerchi; c++) { cx = cx + 2*r2; g2.fill (new Ellipse2D.Duoble (cx, cy, r2, r2)); for (int c = ncerchi + 1; c < ncmax+1; c++) { cx = cx + 2*r2; g2.draw (new Ellipse2D.Duoble (cx, cy, r2, r2));

13 THREAD IN JAVA 29 La classe Frame_xThread dispone di un frame suddiviso in due regioni. Nella regione di sinistra sono collocati otto dischi blu. Il programma realizzato dalla classe comporta l eliminazione dei dischi blu dalla regione sinistra con corrispondente generazione di otto dischi rossi nella regione destra. Il processo che sottende la trasformazione è basato su due metodi principali: il metodo produci() e il metodo consuma(). La trasformazione deve dunque avvenire per produzione di dischi blu da rendere disponibili per la consumazione (trasformazione) in corrispondenti dischi rossi. La classe è realizzata in forma mista, sfruttando sia classi dell architettura AWT sia classi JFC/Swing. La forma complessiva del frame prevede due regioni di tracciatura, istanziate dalla classe PanThread derivata da Canvas, e un sottostante pannello vuoto di classe JPanel inserito per possibili usi successivi. Le due regioni di tracciatura, denominate rgnprod e rgncons, sono destinate a visualizzare i dischi blu e rossi afferenti alle sottofinestre sinistra e destra del frame a mano a mano che il processo evolve. La regione rgnprod è inizializzata con ncmax = 8 dischi blu, mentre la regione rgncons è priva di dischi: le variabili cinit_prod e cinit_cons stabiliscono lo stato iniziale delle due regioni. I colori dei dischi provengono dalla definizione dei colori di foreground delle rispettive regioni, mentre la costante r2 ne stabilisce il diametro. Le variabili cbasex e cbasey definiscono le posizioni dei punti iniziali a partire dai quali saranno collocati i dischi nelle due regioni di tracciatura. Dichiarazione delle variabili private final int ncmax = 8; private final int r2 = 20; private PanThread rgnprod, rgncons; private int cinit_prod = ncmax, cinit_cons = 0; private int cbasex = 20; private int cbasey = 20; Dopo la creazione della finestra grafica, derivata dalla classe JFrame nel modo consueto al contesto JFC/Swing e basata su un modello di distribuzione dei componenti di tipo BorderLayout, la classe crea le regioni rgnprod e rgncons istanziandole dalla classe PanThread e dotandole dei dischi di propria pertinenza. In questa fase il metodo setbackground() assegna alla regione rgnprod uno sfondo giallo e il metodo setforeground() stabilisce per essa il colore di tracciatura blu. I corrispondenti colori della regione rgncons sono il ciano e il rosso. Le due regioni vengono quindi inserite dal metodo add() nelle parti West e East del layout del contenitore cnt del frame. Generazione del frame public Frame_xThread() { rgnprod = new PanThread (cinit_prod); rgnprod.setsize (340, 200); rgnprod.setbackground (Color.yellow); rgnprod.setforeground (Color.blue); cnt.add (rgnprod, West ); rgncons = new PanThread (cinit_cons); rgncons.setsize (340, 200);

14 30 CAPITOLO 18 rgncons.setbackground (Color.cyan); rgncons.setforeground (Color.red); cnt.add (rgncons, East ); Successivamente è creato il pannello controlli, che viene dotato di sfondo grigio e allocato nella parte South del contenitore cnt. L ultima operazione di Frame_xThread() consiste nel rendere visibile il frame con il metodo setvisible(). Completamento del frame public Frame_xThread() { Panel controlli = new JPanel(); controlli.setbackground (Color.lightGray); cnt.add (controlli, South ); setvisible (true true); Il processo di visualizzazione dei dischi nelle due regioni di tracciatura rgnprod e rgncons è realizzato dalla classe interna PanThread. Il costruttore della classe trascrive nella variabile d istanza ncerchi il numero di dischi inizialmente presenti nella regione. Tale valore verrà modificato durante l esecuzione del programma a mano a mano che i dischi verranno trasferiti dalla regione rgnprod alla regione rgncons. Costruttore della classe di visualizzazione public PanThread (int ncerchi) { super(); this.ncerchi = ncerchi; Il metodo paint() utilizza il valore di ncerchi per tracciare a campitura piena, con il metodo fill(), i dischi presenti nella regione su cui è attivato e per disegnare con il metodo draw() il profilo dei dischi mancanti. In tale contesto i valori di cbasex e cbasey definiscono i punti di riferimento iniziali del processo di tracciatura, mentre r2 stabilisce l ampiezza del rettangolo di contenimento dei dischi. Visualizzazione di regione public void paint (Graphics g) { int cx = cbasex; int cy = cbasey; Graphics2D g2 = (Graphics2D) g; for (int c = 0; c < ncerchi; c++) { cx = cx + 2*r2; g2.fill (new Ellipse2D.Duoble (cx, cy, r2, r2)); for (int c = ncerchi + 1; c < ncmax+1; c++) { cx = cx + 2*r2;

15 THREAD IN JAVA 31 g.draw (new Ellipse2D.Duoble (cx, cy, r2, r2)); I metodi della classe Frame_xThread che sottendono alla trasformazione delle configurazioni delle regioni rgnprod e rgncons sono i metodi produci() e consuma(). Il metodo produci() opera sulla regione rgnprod: la chiamata riduce progressivamente di un unità il numero di dischi presenti nella regione, richiede la tracciatura della nuova configurazione della stessa e si sospende per 1000 millisecondi. In modo analogo il metodo consuma() opera sulla regione rgncons, incrementando progressivamente di un unità il numero di dischi della regione, richiedendo la tracciatura della nuova configurazione raggiunta e sospendendosi per uno stesso periodo temporale. public class Frame_xThread extends JFrame implements Runnable { public synchronized void produci() { for (int c = 0; c < ncmax; c++) { rgnprod.ncerchi ; rgnprod.repaint(); try { Thread.sleep (1000); catch (InterruptedException e) { throw new RuntimeException(); public /* synchronized */ void consuma() { for (int c = 0; c < ncmax; c++) { rgncons.ncerchi++; rgncons.repaint(); try { Thread.sleep (1000); catch (InterruptedException e) { throw new RuntimeException(); public void run() { consuma(); La sospensione del thread è ottenuta in entrambi i metodi produci() e consuma() con l uso del metodo statico sleep() della classe Thread, che è utilizzabile dal momento che la classe Frame_xThread implementa l interfaccia Runnable. Si consideri che la sospensione del thread è inserita sia per permettere all osservatore di seguire l evoluzione del processo di trasformazione nella distribuzione dei dischi nelle due regioni, sia per rendere palese il diverso funzionamento dell applicazione quando i metodi produci() e consuma() sono entrambi dichiarati sincronizzati rispetto a quando non lo sono.

16 32 CAPITOLO 18 La classe Frame_xThread è completata dal metodo run() contenente il codice dei thread da essa istanziabili. Come si nota, il thread si limita ad operare una chiamata al metodo consuma() per modificare la regione rgncons della GUI. Codice del thread public class Frame_xThread extends JFrame implements Runnable { public void run() { consuma(); La trasformazione complessiva delle configurazioni di dischi nelle due regioni di tracciatura del frame proviene dalla coordinata esecuzione di entrambi i metodi produci() e consuma(). La classe Pgm_xThread ne implementa la realizzazione. import java.awt.*; public class Pgm_xThread { public static void main (String[] args) { Frame_xThread winthread = new Frame_xThread(); Thread th1 = new Thread (winthread); th1.start(); winthread.produci(); L applicazione genera inizialmente un thread, denominato th1, creando un istanza della classe Frame_xThread e passando l oggetto winthread così istanziato al costruttore Thread() della omonima classe. Generazione thread public static void main (String[] args) { Frame_xThread winthread = new Frame_xThread(); Thread th1 = new Thread (winthread); Il thread th1 viene quindi attivato con il comando th1.start() per l esecuzione del metodo consuma(). Attivazione thread: consuma() public static void main (String[] args) { th1.start(); Infine viene effettuata l attivazione del metodo produci() dello stesso thread inoltrandone la richiesta all istanza winthread della classe Frame_xThread.

17 THREAD IN JAVA 33 Attivazione metodo: produci() public static void main (String[] args) { winthread.produci(); 18.5 Sincronizzazione dei thread Un aspetto importante dei sistemi multi-thread riguarda il trasferimento di dati tra processi diversi. Sull argomento la letteratura riporta numerose tecniche e soluzioni. Indipendentemente dalla metodologia seguita, va sottolineato che lo scambio dati fra thread richiede che gli stessi vengano sottoposti ad una fase di sincronizzazione. La tecnica presentata nel seguito si basa sulla presenza di monitor. Un monitor costituisce una risorsa software che viene condivisa fra i thread operanti lo scambio dati, in modo da forzare gli stessi a sincronizzarsi. La Figura 18.8 riporta due situazioni tipiche. Nella forma più semplice, presentata in Figura 18.8 (a), il monitor funge da sincronizzatore dei thread thd1 e thd2 durante lo scambio dati: la sua funzione è di acquisire il dato trasmesso dal thread mittente e di sospendere quest ultimo sino a che il thread destinatario lo non avrà ricevuto. La situazione è del tutto generalizzabile. A titolo dimostrativo, in Figura 18.8 (b) esistono più thread mittenti, denominati thdp1,, thdpn, e un thread ricevente thdc. In questo caso il monitor acquisisce un dato dal primo thread mittente pronto a trasmettere, ne sospende l attività al pari dei rimanenti thread mittente, così da impedire la sovrapposizione di dati diversi in ingresso, inoltra il dato al thread ricevente thdc dopo averlo risvegliato dal suo eventuale stato di sospensione. Ciò fatto, il monitor si rende disponibile per un successivo scambio dati sospendendo il thread ricevente e risvegliando tutti i thread mittente che erano stati precedentemente sospesi. Le operazioni di cui si è trattato richiedono che il linguaggio di implementazione disponga di primitive in grado di agire sull esecuzione dei thread, forzandone la sospensione e la successiva riattivazione. In Java ciascun oggetto può costituire una risorsa condivisa da più Figura 18.8 Utilizzazione dei monitor per la sincronizzazione di thread.

18 34 CAPITOLO 18 thread, per cui i metodi destinati alla loro sincronizzazione devono essere insiti negli oggetti stessi. Essi entrano quindi di diritto nella classe Object del package java.lang da cui discendono le classi di applicazione. Object void wait() native void wait (long timeout) native void notify() native void notifyall() Il primo metodo fornito dalla classe presiede alle operazioni di sospensione dei thread. Un thread sospeso perde il possesso della risorsa condivisa su cui opera e viene inserito nella coda dei processi in attesa. I metodi wait() sospendono il thread correntemente in esecuzione, facendogli perdere il controllo della risorsa condivisa in quel momento posseduta. I thread sospesi e in attesa del rilascio di una risorsa condivisa possono essere risvegliati da altro thread operante sulla stessa risorsa con il metodo notify() oppure con il metodo notifyall(). I thread così risvegliati competono per riottenere il controllo della risorsa in base alla loro priorità e/o al momento della loro sospensione. Nella seconda forma, il metodo wait() può limitare la sospensione del thread corrente al tempo indicato dal parametro timeout. In entrambe le forme il metodo può sollevare un eccezione di tipo InterruptedException. Due ulteriori metodi sono destinati alle operazioni di risveglio dei thread. Un thread risvegliato è trasferito nella coda dei processi pronti e può competere per ottenere nuovamente il possesso della risorsa condivisa di interesse. Il metodo notify() risveglia un singolo thread che è stato sospeso in attesa del rilascio di una risorsa condivisa. Il thread può ottenere il possesso della risorsa eseguendo un metodo sincronizzato appartenente alla risorsa stessa. Il metodo notifyall() risveglia tutti i thread che sono stati sospesi in attesa del rilascio di una risorsa condivisa. I metodi risvegliati competono per riottenere il controllo della risorsa in base alla loro priorità e/o al momento della loro sospensione Un esempio di sincronizzazione di thread Il problema proposto nel Paragrafo si interessava della sincronizzazione di metodi in un modello di processo denominato produttore-consumatore. Quell esempio può essere generalizzato e completato in riferimento allo scambio dati fra thread diversi. La classe Frame_xThreads (Scheda 18.5a) fornisce un esempio di sincronizzazione di thread per l implementazione di un modello di scambio dati basato su monitor. Due thread produttori di dischi, di colori rispettivi blu e rosso, inoltrano i dischi da essi inizialmente posseduti ad un thread consumatore con cadenze temporali distinte. I thread sono costituiti da istanze delle classi Produttore e Consumatore. Per evitare conflittualità fra i diversi processi, lo scambio dati avviene attraverso una risorsa condivisa costituita da un istanza della classe Monitor. La sua funzione è di sincronizzare le operazioni di trasferimento dei dischi dai due thread produttori verso il thread consumatore.

19 THREAD IN JAVA 35 Figura 18.9 Architettura d insieme dell applicazione. La Figura 18.9 riporta l architettura software complessiva. Ai sottostanti thread produttori e consumatore, che costituiscono il nucleo dell applicazione, è associata un interfaccia grafica ripartita in tre regioni di tracciatura distinte, una per ciascun thread, con il compito di visualizzarne istante per istante lo stato. Si osservi che le diverse componenti software coinvolte nell applicazione sono tutte nettamente separate tra di loro, il che comporta una più semplice progettazione e linearità nella definizione delle classi. La classe principale dell applicazione è ora responsabile solamente della costruzione della GUI, suddivisa nelle tre regioni rgncons, rgnprod1 e rgnprod2, e dei metodi responsabili della visualizzazione dello stato dei diversi thread, mentre le operazioni di basso livello necessarie per la tracciatura dei dischi competono ad una ulteriore classe PanThread derivata da Canvas. Il cuore dell applicazione è costituito dalle classi Produttore e Consumatore, dalle quali sono generati gli omonimi thread, e la classe Monitor da cui istanziare il monitor necessario per la sincronizzazione delle attività dei processi. Il monitor infatti costituisce una risorsa condivisa dai thread produttori e consumatore, che si comporta come un supporto intermedio di trasferimento per i dischi. È basato su due metodi synchronized, denominati ricezione() e rilascio(), il cui funzionamento è l uno il duale dell altro: il metodo ricezione() è invocato dai thread della classe Produttore per inoltrare al monitor i propri dischi, mentre il metodo rilascio() è destinato ai thread della classe Consumatore per ricevere dal monitor i dischi in esso presenti.

20 36 CAPITOLO 18 Scheda 18.5a - class Argomenti class Frame_xThreads Sincronizzazione di thread. Modello implementato: monitor. Classi: Produttore, Consumatore, Monitor. import java.awt.*; import java.awt.event.*; import java.util.*; import java.awt.geom.*; import javax.swing.*; public class Frame_xThreads extends JFrame { private final int RGN_CONS = 0, RGN_PROD1 = 1, RGN_PROD2 = 2; private PanThread rgncons, rgnprod1, rgnprod2; public Frame_xThreads() { setdefaultcloseoperation (JFrame.EXIT_ON_CLOSE); Container cnt = getcontentpane(); cnt.setbackground (Color.white); cnt.setlayout (new BorderLayout()); settitle ( Produttori - Consumatore ); setbounds (30, 30, 700, 500); rgnprod1 = new PanThread(); rgnprod1.setsize (340, 300); rgnprod1.setbackground (Color.yellow); cnt.add (rgnprod1, West ); rgnprod2 = new PanThread(); rgnprod2.setsize (340, 500); rgnprod2.setbackground (Color.yellow); cnt.add (rgnprod2, East ); rgncons = new PanThread(); rgncons.setsize (700, 200); rgncons.setbackground (Color.lightGray); cnt.add (rgncons, South ); setvisible (true true); public void modificaregione (int rgn, int nmaxcerchi, Vector vt) { switch (rgn) { case 0: rgncons.setelements (vt, nmaxcerchi); rgncons.repaint(); break; case 1: rgnprod1.setelements (vt, nmaxcerchi); rgnprod1.repaint(); break; case 2: rgnprod2.setelements (vt, nmaxcerchi); rgnprod2.repaint(); break;

Programmazione concorrente in Java

Programmazione concorrente in Java Programmazione concorrente in Java Multithreading in Java Ogni thread e un oggetto, creato come istanza della classe java.lang.thread La classe Thread contiene tutti i metodi per gestire i threads L utente

Dettagli

Gestione dei thread in Java LSO 2008

Gestione dei thread in Java LSO 2008 Gestione dei thread in Java LSO 2008 Cos è un Thread? Si può avere la necessità di suddividere un programma in sottoattività separate da eseguire indipendentemente l una dall altra Queste sottoattività

Dettagli

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

T 1. Per un processo con più thread di controllo, lo stato di avanzamento della computazione di ogni thread è dato da: Un thread (o processo leggero) è una attività, descritta da una sequenza di istruzioni, che esegue all'interno del contesto di esecuzione di un programma. Un thread procede nella sua esecuzione per portare

Dettagli

Synchronized (ancora)

Synchronized (ancora) Synchronized (ancora) Riscriviamo l esempio di prima. Usiamo una struttura modulare, con una classe Notificatore che ha opportuni metodi. La classe ha due campi privati, la lista buftext e un suo thread.

Dettagli

Multithreading in Java. Fondamenti di Sistemi Informativi 2014-2015

Multithreading in Java. Fondamenti di Sistemi Informativi 2014-2015 Multithreading in Java Fondamenti di Sistemi Informativi 2014-2015 Multithreading La programmazione concorrente consente di eseguire più processi o thread nello stesso momento. Nel secondo caso si parla

Dettagli

Java Virtual Machine

Java Virtual Machine Java Virtual Machine programmi sorgente: files.java compilatore files.class bytecode linker/loader bytecode bytecode Java API files.class interprete macchina ospite Indipendenza di java dalla macchina

Dettagli

Java threads (2) Programmazione Concorrente

Java threads (2) Programmazione Concorrente Java threads (2) emanuele lattanzi isti information science and technology institute 1/28 Programmazione Concorrente Utilizzo corretto dei thread in Java emanuele lattanzi isti information science and

Dettagli

Con il pulsante Start si introducono palline che rimbalzano in un area di disegno fino a che non è terminato il loro ciclo di vita (1000 movimenti).

Con il pulsante Start si introducono palline che rimbalzano in un area di disegno fino a che non è terminato il loro ciclo di vita (1000 movimenti). Rimbalzi. import java.awt.*; import java.awt.event.*; import java.applet.applet; public class Bounce extends Applet implements ActionListener { private Canvas canvas; private Button b1; private Button

Dettagli

COGNOME.NOME. Matricola

COGNOME.NOME. Matricola Esame di PROGRAMMAZIONE ORIENTATA AGLI OGGETTI Appello del 4.9.2013 COGNOME.NOME. Matricola Tre classi, denominate Anemone, Fiordaliso e Viola devono assicurare la visualizzazione di un fiore stilizzato

Dettagli

19. Introduzione al multi-threading

19. Introduzione al multi-threading 19. Introduzione al multi-threading Marco Faella Dip. Ing. Elettrica e Tecnologie dell'informazione Università di Napoli Federico II Corso di Linguaggi di Programmazione II I thread I thread, o processi

Dettagli

GESTIONE DEI PROCESSI

GESTIONE DEI PROCESSI Sistemi Operativi GESTIONE DEI PROCESSI Processi Concetto di Processo Scheduling di Processi Operazioni su Processi Processi Cooperanti Concetto di Thread Modelli Multithread I thread in Java Concetto

Dettagli

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

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica Esercitazioni di PROGETTAZIONE DEL SOFTWARE (Corsi di Laurea in Ingegneria Informatica ed Automatica ed Ingegneria

Dettagli

UN CLONE IN CLIKE C-LIKE DI SEGUIVISIONE

UN CLONE IN CLIKE C-LIKE DI SEGUIVISIONE IDROID 86 LAB pagg 12-13 23-04-2007 14:57 Pagina 12 I-D01 LAB UN CLONE IN CLIKE C-LIKE DI SEGUIVISIONE PROGRAMMAZIONE Alcuni comportamenti predefiniti attivabili su I-Droid01 sono facilmente riproducibili

Dettagli

Telematica II 17. Esercitazione/Laboratorio 6

Telematica II 17. Esercitazione/Laboratorio 6 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

Dettagli

Programmazione Concorrente in Java

Programmazione Concorrente in Java Programmazione Concorrente in Java Lorenzo Bettini Dip. Sistemi e Informatica, Univ. Firenze http://www.dsi.unifi.it/~bettini Ottobre 2005 Gestione dei Processi Un processo è un programma in esecuzione.

Dettagli

Java Applet. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2009-2010

Java Applet. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2009-2010 Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2009-2010 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it Java Applet 1 Application VS Applet Una

Dettagli

Informatica 3. Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Lezione 6 - Modulo 1. Errori durante l esecuzione. Il controllo dell esecuzione

Informatica 3. Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Lezione 6 - Modulo 1. Errori durante l esecuzione. Il controllo dell esecuzione Informatica 3 Informatica 3 LEZIONE 6: Il controllo dell esecuzione Modulo 1: La gestione delle eccezioni Modulo 2: Programmazione concorrente Lezione 6 - Modulo 1 La gestione delle eccezioni Politecnico

Dettagli

Programmazione concorrente in Java. Dr. Paolo Casoto, Ph.D. - 2012 1

Programmazione concorrente in Java. Dr. Paolo Casoto, Ph.D. - 2012 1 + Programmazione concorrente in Java 1 + Introduzione al multithreading 2 La scomposizione in oggetti consente di separare un programma in sottosezioni indipendenti. Oggetto = metodi + attributi finalizzati

Dettagli

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008. - lezione 14 - Thread in Java

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008. - lezione 14 - Thread in Java Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it - lezione 14 - Thread in Java 1 Cos è un

Dettagli

Un esercizio d esame. Flavio De Paoli

Un esercizio d esame. Flavio De Paoli Un esercizio d esame e note sulla gestione dei dati Flavio De Paoli Il testo (Appello 22 ottobre 2001) Una stazione di servizio dispone di n distributori di benzina. I clienti si presentano a uno dei distributori

Dettagli

Lezione 15 Programmazione multithreaded

Lezione 15 Programmazione multithreaded Lezione 15 Programmazione multithreaded Tutti i sistemi operativi, al giorno d'oggi, permettono di svolgere più operazioni simultaneamente. In questo momento, ad esempio, sto usando un word processor per

Dettagli

Laboratorio di Sistemi Thread Java

Laboratorio di Sistemi Thread Java Premessa Fare più di una cosa contemporaneamente per noi è una cosa piuttosto comune. La vita quotidiana è piena di esempi che ci possono chiarire il significato dell'avverbio contemporaneamente. Ad esempio

Dettagli

Esercitazioni Ingegneria del So2ware 8 Threads. Giordano Tamburrelli tamburrelli@elet.polimi.it h@p://giordano.webfacdonal.com

Esercitazioni Ingegneria del So2ware 8 Threads. Giordano Tamburrelli tamburrelli@elet.polimi.it h@p://giordano.webfacdonal.com Esercitazioni Ingegneria del So2ware 8 Threads Giordano Tamburrelli tamburrelli@elet.polimi.it h@p://giordano.webfacdonal.com 1 Flusso (thread) di esecuzione In un programma sequenziale esiste un solo

Dettagli

Supporto al Sistema Operativo

Supporto al Sistema Operativo Supporto al Sistema Operativo Middleware di supporto al sistema operativo in sistemi distribuiti Funzione del nucleo Modelli architetturali di SO Decomposizione delle funzionalità Processi, thread, processi

Dettagli

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

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio QUEUE : considerazioni QUEUE : considerazioni Si è realizzata una struttura dati complessa utilizzandone una primitiva, l array. Il pregio di tale implementazione è il basso costo computazionale, mentre

Dettagli

Processi. Laboratorio Software 2008-2009 C. Brandolese

Processi. Laboratorio Software 2008-2009 C. Brandolese Processi Laboratorio Software 2008-2009 Introduzione I calcolatori svolgono operazioni simultaneamente Esempio Compilazione di un programma Invio di un file ad una stampante Visualizzazione di una pagina

Dettagli

APPLICAZIONI & APPLET

APPLICAZIONI & APPLET APPLICAZIONI & APPLET Java è un ottimo linguaggio per costruire applicazioni anche non per Internet anche non grafiche ma si è diffuso storicamente, e trae forza, dal concetto di applet come piccola (?)

Dettagli

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati Condizione di sincronizzazione Qualora si voglia realizzare una determinata politica di gestione delle risorse,la decisione se ad

Dettagli

Thread e Task. L20_MultiThread 2

Thread e Task. L20_MultiThread 2 I Thread in Java Thread e Task Multitasking: capacità dei sistemi operativi di eseguire più programmi contemporaneamente. Ciascun programma ha il proprio insieme di variabili, costanti, ecc. Multithreading

Dettagli

progam ponteasensounicoalaternato ; type dir = ( nord, sud );

progam ponteasensounicoalaternato ; type dir = ( nord, sud ); Esercizio di Sincronizzazione Tra Processi: Ponte a Senso Unico Alternato Un ponte contiene una sola csia di traffico consentendo così l'accesso a macchine provenienti da una sola direzione per volta,

Dettagli

Introduzione al package grafico Swing

Introduzione al package grafico Swing Introduzione al package grafico Swing Architettura di javax.swing Java supporta direttamente nella propria architettura il concetto di applicazione grafica, tramite il package javax.swing, in cui i componenti

Dettagli

PROGETTO DI UN MIDDLEWARE PER L ACCESSO REMOTO A UN REPOSITORY

PROGETTO DI UN MIDDLEWARE PER L ACCESSO REMOTO A UN REPOSITORY Giampiero Allamprese 0000260193 PROGETTO DI UN MIDDLEWARE PER L ACCESSO REMOTO A UN REPOSITORY Reti di Calcolatori LS prof. Antonio Corradi A.A. 2007/2008 ABSTRACT L obiettivo di questo progetto è la realizzazione

Dettagli

Il costrutto monitor [Hoare 74]

Il costrutto monitor [Hoare 74] Il monitor 1 Il costrutto monitor [Hoare 74] Definizione: Costrutto sintattico che associa un insieme di operazioni (entry, o public) ad una struttura dati comune a più processi, tale che: Le operazioni

Dettagli

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi Linguaggio Java Robusto Non permette costrutti pericolosi Eredità Multipla Gestione della Memoria Orientato agli oggetti Ogni cosa ha un tipo Ogni tipo è un oggetto (quasi) Protegge e gestisce dagli errori

Dettagli

Sincronizzazione con Java

Sincronizzazione con Java Sincronizzazione con Java Corse critiche e sincronizzazione Java implementa un meccanismo simile al monitor per garantire la sincronizzazione fra thread Ogni oggetto ha un lock associato ad esso Nelle

Dettagli

Definizione di thread Proprietà dei thread in Java Gestione delle priorità nei programmi multithreaded Gruppi di thread Accesso a variabili condivise

Definizione di thread Proprietà dei thread in Java Gestione delle priorità nei programmi multithreaded Gruppi di thread Accesso a variabili condivise CEFRIEL Centro per la Formazione e la Ricerca in Ingegneria dell Informazione Politecnico di Milano Java Multithreading Programmazione concorrente in Java Docente: Diego Peroni peroni@cefriel.it Indice

Dettagli

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

I Canvas. import java.awt.*; import javax.swing.*; public class Graf{ public Graf () { JFrame f = new JFrame(Finestra); // crea frame invisibile I Canvas Tra i vari contenitori Java il Canvas (area di disegno o tela) è una semplice superficie di disegno particolarmente utile per visualizzare immagini o per effettuare altre operazioni grafiche.

Dettagli

Le basi della grafica in Java. Prof. Francesco Accarino IIS Altiero Spinelli via Leopardi 132 Sesto san Giovanni

Le basi della grafica in Java. Prof. Francesco Accarino IIS Altiero Spinelli via Leopardi 132 Sesto san Giovanni Le basi della grafica in Java Prof. Francesco Accarino IIS Altiero Spinelli via Leopardi 132 Sesto san Giovanni Elaborazione classica o imperativa L elaborazione è concentrata nel momento centrale, durante

Dettagli

Classi astratte. Master in Web Technology e Security luglio - settembre 2000. Interfacce

Classi astratte. Master in Web Technology e Security luglio - settembre 2000. Interfacce Master in Web Technology e Security luglio - settembre 2000 JAVA Alberto Martelli Parte III Programmazione grafica Classi astratte Vogliamo implementare un algoritmo di ordinamento di un array che sia

Dettagli

Gestione delle eccezioni in Java

Gestione delle eccezioni in Java Gestione delle eccezioni in Java - Introduzione al concetto di eccezioni E possibile definire un eccezione come un situazione imprevista che il flusso di un applicazione può incontrare. È possibile gestire

Dettagli

CAP. 6: Nucleo del sistema operativo (La gestione dei processi)

CAP. 6: Nucleo del sistema operativo (La gestione dei processi) Struttura interna del sistema operativo Linux CAP. 6: Nucleo del sistema operativo (La gestione dei processi) Architettura del sistema operativo shell Programmi utente Modo utente Interfaccia delle chiamate

Dettagli

Alessandro De Luca. Lezione, 13 maggio 2015

Alessandro De Luca. Lezione, 13 maggio 2015 Basi Basi di di dati dati ee sistemi sistemi informativi informativi II mod.laboratorio mod.laboratorio Alessandro De Luca Università degli Studi di Napoli Federico II Lezione, Introduzione a Java Swing

Dettagli

TECNOLOGIE APPLICAZIONI WEB Linguaggio Java: Le Applet

TECNOLOGIE APPLICAZIONI WEB Linguaggio Java: Le Applet Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE APPLICAZIONI WEB Linguaggio Java: Le Applet Prof. Franco Zambonelli Lucidi realizzati in collaborazione

Dettagli

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione. Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione. Compito fondamentale di un S.O. è infatti la gestione dell

Dettagli

Introduzione a Classi e Oggetti

Introduzione a Classi e Oggetti Introduzione a Classi e Oggetti Oggetto: concetto astratto Entità di un programma dotata di tre proprietà caratteristiche stato informazioni conservate nell oggetto condizionano il comportamento dell oggetto

Dettagli

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:

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: Tipi primitivi Il linguaggio Java offre alcuni tipi di dato primitivi Una variabile di tipo primitivo può essere utilizzata direttamente. Non è un riferimento e non ha senso tentare di istanziarla mediante

Dettagli

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

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) 12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica,

Dettagli

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

Esercitazioni 7 e 8. Bounded Buffer con sincronizzazione Java (1) Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002 Corsi A e B Esercitazioni 7 e 8 Bounded Buffer con sincronizzazione Java (1) public class BoundedBuffer private

Dettagli

Il costrutto monitor [Hoare 74]

Il costrutto monitor [Hoare 74] Il monitor 1 Il costrutto monitor [Hoare 74] Definizione: Costrutto sintattico che associa un insieme di operazioni (entry o public) ad una struttura dati comune a più processi, tale che: Le operazioni

Dettagli

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti 13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/

Dettagli

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

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008. Esercitazione. Programmazione Object Oriented in Java Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it Programmazione Object Oriented in Java

Dettagli

ESAME DI FONDAMENTI DI INFORMATICA T-2 del 15/07/2015 Proff. E. Denti G. Zannoni Tempo a disposizione: 4 ore MAX

ESAME DI FONDAMENTI DI INFORMATICA T-2 del 15/07/2015 Proff. E. Denti G. Zannoni Tempo a disposizione: 4 ore MAX ESAME DI FONDAMENTI DI INFORMATICA T-2 del 15/07/2015 Proff. E. Denti G. Zannoni Tempo a disposizione: 4 ore MAX NB: il candidato troverà nell archivio ZIP scaricato da Esamix anche il software Start Kit

Dettagli

L interfaccia grafica in Java

L interfaccia grafica in Java L interfaccia grafica in Java Java possiede due package per la creazione di interfacce grafiche java.awt javax.swing AWT (Abstract Widget Toolkit) presente già in Java 1.0, migliorato in Java 1.1. Invariato

Dettagli

L applicazione di MVC alla simulazione di ascensore I COMPONENTI DELLE INTERFACCE UTENTE GRAFICHE: PARTE II 1

L applicazione di MVC alla simulazione di ascensore I COMPONENTI DELLE INTERFACCE UTENTE GRAFICHE: PARTE II 1 I COMPONENTI DELLE INTERFACCE UTENTE GRAFICHE: PARTE II 1 3.13 (Caso di studio facoltativo) Pensare a oggetti: Modello-Vista-Controllore I design pattern descrivono strategie efficaci per costruire sistemi

Dettagli

Monitor. Introduzione. Struttura di un TDA Monitor

Monitor. Introduzione. Struttura di un TDA Monitor Monitor Domenico Cotroneo Dipartimento di Informatica e Sistemistica Introduzione E stato introdotto per facilitare la programmazione strutturata di problemi in cui è necessario controllare l assegnazione

Dettagli

Prova d Esame 07.04.2006 Compito A

Prova d Esame 07.04.2006 Compito A DOMANDA 1 (6 punti) Si analizzi il codice seguente e si scriva l output prodotto dai metodi main public class General { public static String s1 = "Ciao"; protected int n; public General() { n = 1; public

Dettagli

Introduzione al linguaggio Java. Applicazioni ed Applets: come scriverli e farli girare. Caratteristiche originali e differenze con C / C++.

Introduzione al linguaggio Java. Applicazioni ed Applets: come scriverli e farli girare. Caratteristiche originali e differenze con C / C++. Introduzione al linguaggio Java Cosa c è di nuovo in Java? Java ed Internet. Applicazioni ed Applets: come scriverli e farli girare. Caratteristiche originali e differenze con C / C++. Dove trovare informazioni?

Dettagli

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino Il Sistema Operativo Il Sistema Operativo è uno strato software che: opera direttamente sull hardware; isola dai dettagli dell architettura hardware; fornisce un insieme di funzionalità di alto livello.

Dettagli

! Programmazione strutturata. ! OO: TDA, scambio messaggi, eredità, polimorfismo, OO in Java. ! Rassegna API. ! Documentazione Javadoc delle API

! Programmazione strutturata. ! OO: TDA, scambio messaggi, eredità, polimorfismo, OO in Java. ! Rassegna API. ! Documentazione Javadoc delle API Riassunto Applet (e altro dell AWT ) Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro/ mizzaro@uniud.it Programmazione, lezione 22 19 maggio

Dettagli

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2014-15. Pietro Frasca.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2014-15. Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2014-15 Pietro Frasca Lezione 5 Martedì 21-10-2014 Thread Come abbiamo detto, un processo è composto

Dettagli

Interfacce grafiche. Una GUI (Graphic User Interface) contiene vari componenti: bottoni, etichette, immagini...

Interfacce grafiche. Una GUI (Graphic User Interface) contiene vari componenti: bottoni, etichette, immagini... Interfacce grafiche Una GUI (Graphic User Interface) contiene vari componenti: bottoni, etichette, immagini... Alcuni componenti ne contengono altri (ad esempio le finestre), e sono detti contenitori.

Dettagli

UML Diagrammi delle classi. UML Diagramma classi 1

UML Diagrammi delle classi. UML Diagramma classi 1 UML Diagrammi delle classi UML Diagramma classi 1 Diagramma delle classi Non è nei nostri obiettivi affrontare UML nel suo complesso Ci concentreremo sui diagrammi delle classi che ci forniscono un linguaggio

Dettagli

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193 Servers Activatable Nelle lezioni precedenti abbiamo detto che una referenza remota ad un server di tipo UnicastRemoteObject rimane valida finchè il server è in esecuzione. Quando il server termina, o

Dettagli

La concorrenza in Java package java.util.concurrent Antonio Furone

La concorrenza in Java package java.util.concurrent Antonio Furone La concorrenza in Java package java.util.concurrent Antonio Furone Coda Bloccante La classe LinkedTransferQueue è stata esplicitamente disegnata per dare supporto a problemi di tipo produttore/consumatore.

Dettagli

L interfaccia grafica con Java

L interfaccia grafica con Java L interfaccia grafica con Java 1/24 L interfaccia utente serve per la comunicazione tra utente e programma Distinguiamo le interfacce tra quelle a caratteri e quelle grafiche Le GUI (Graphical user interface)

Dettagli

Laboratorio di Programmazione di Rete Corso A

Laboratorio di Programmazione di Rete Corso A Laboratorio di Programmazione di Rete Corso A Anno Accademico 2005-2006 Docente: Laura Ricci Assistente: Paolo Mori INFORMAZIONI UTILI Orario del Corso: Lunedì 9.00-11.00 Laboratorio Gruppo A 11.00-13.00

Dettagli

20 - Input/Output su File

20 - Input/Output su File 20 - Input/Output su File Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it

Dettagli

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

Chat. Si ha un server in ascolto sulla porta 4444. Quando un client richiede la connessione, il server risponde con: Connessione accettata. Chat Si ha un server in ascolto sulla porta 4444 Quando un client richiede la connessione, il server risponde con: Connessione accettata. Nome: Il client deve rispondere con lo user name A questo punto

Dettagli

Java RMI: Esempio Completo di un Applicazione Distribuita

Java RMI: Esempio Completo di un Applicazione Distribuita Java RMI: Esempio Completo di un Applicazione Distribuita Il Problema Produttore/Consumatore in Ambiente Distribuito* *a cura del Prof. L. Nigro, Università della Calabria Java RMI (Remote Method Invocation)

Dettagli

SISTEMI OPERATIVI. Sincronizzazione dei processi. Domande di verifica. Luca Orrù Centro Multimediale Montiferru 30/05/2007

SISTEMI OPERATIVI. Sincronizzazione dei processi. Domande di verifica. Luca Orrù Centro Multimediale Montiferru 30/05/2007 2007 SISTEMI OPERATIVI Sincronizzazione dei processi Domande di verifica Luca Orrù Centro Multimediale Montiferru 30/05/2007 Sincronizzazione dei processi 1. Si descrivano i tipi di interazione tra processi?

Dettagli

Processi e thread. Dipartimento di Informatica Università di Verona, Italy. Sommario

Processi e thread. Dipartimento di Informatica Università di Verona, Italy. Sommario Processi e thread Dipartimento di Informatica Università di Verona, Italy Sommario Concetto di processo Stati di un processo Operazioni e relazioni tra processi Concetto di thread Gestione dei processi

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

LAVORI ESTIVI DI INFORMATICA PER LA CLASSE IV Sez. Ainf (Prof. Tessore Luca)

LAVORI ESTIVI DI INFORMATICA PER LA CLASSE IV Sez. Ainf (Prof. Tessore Luca) Ministero dell Istruzione, dell Università e della Ricerca Istituto Tecnico Industriale Statale Enrico Mattei Via Martiri di Cefalonia 46-20097 San Donato Milanese Tel. 0255691411 - Fax 025276676 itisando@tin.it

Dettagli

Programmazione AA 2012 2013

Programmazione AA 2012 2013 Programmazione ad Oggetti AA 2012 2013 Contenuti del corso Modulo A Tecniche di programmazione Docente: Prof. Michele Bugliesi Modulo B Tecniche di progetto Docente: Prof. Alessandro Roncato Contenuti

Dettagli

CAPITOLO 1 I SISTEMI OPERATIVI

CAPITOLO 1 I SISTEMI OPERATIVI CAPITOLO 1 I SISTEMI OPERATIVI Introduzione ai sistemi operativi pag. 3 La shell pag. 3 Tipi di sistemi operativi pag. 4 I servizi del sistema operativo pag. 4 La gestione dei file e il file system Il

Dettagli

Esercizi sul Monitor in Java

Esercizi sul Monitor in Java Esercizi sul Monitor in Java 1 I filosofi a cena (E. Dijkstra, 1965) 5 filosofi sono seduti attorno a un tavolo circolare; ogni filosofo ha un piatto di spaghetti tanto scivolosi che necessitano di 2 forchette

Dettagli

Esercizi sugli Oggetti Monitor

Esercizi sugli Oggetti Monitor Esercizi sugli Oggetti Monitor Esercitazione di Laboratorio di Programmazione di Rete A Daniele Sgandurra Università di Pisa 29/10/2008 Wait e Notify Ogni oggetto in Java ha un lock implicito. Il lock

Dettagli

Implementazione dei monitor tramite semafori Attesa condizionale Sincronizzazione nei sistemi operativi reali Transazioni atomiche

Implementazione dei monitor tramite semafori Attesa condizionale Sincronizzazione nei sistemi operativi reali Transazioni atomiche Implementazione dei monitor tramite semafori Attesa condizionale Sincronizzazione nei sistemi operativi reali Transazioni atomiche 5.1 Implementazione dei monitor con i semafori Un monitor è un tipo di

Dettagli

PROCESSI ESEMPIO THREAD. RETI DI CALCOLATORI Linguaggio Java: i Thread CORSO DI. Università degli Studi di Modena e Reggio Emilia

PROCESSI ESEMPIO THREAD. RETI DI CALCOLATORI Linguaggio Java: i Thread CORSO DI. Università degli Studi di Modena e Reggio Emilia Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria CORSO DI RETI DI CALCOLATORI Linguaggio Java: i Thread Prof. Franco Zambonelli Lucidi realizzati in collaborazione con Ing. Enrico

Dettagli

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

Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread Terza Esercitazione Unix System Call Exec Java Introduzione Thread Stefano Monti smonti@deis.unibo.it Unix - Esercizio 1 Scrivere un programma C con la seguente interfaccia:./compilaedesegui

Dettagli

Informatica. Prof. A. Longheu. Introduzione ai Linguaggi Object-Oriented

Informatica. Prof. A. Longheu. Introduzione ai Linguaggi Object-Oriented Informatica Prof. A. Longheu Introduzione ai Linguaggi Object-Oriented 1 Generalità programmazione OO La programmazione ad oggetti è un particolare modo di scrivere il programma. Si prevede che: 1) si

Dettagli

Sistemi Operativi. Lez. 13: primitive per la concorrenza monitor e messaggi

Sistemi Operativi. Lez. 13: primitive per la concorrenza monitor e messaggi Sistemi Operativi Lez. 13: primitive per la concorrenza monitor e messaggi Osservazioni I semafori sono strumenti particolarmente potenti poiché consentono di risolvere ogni problema di sincronizzazione

Dettagli

Due applicazioni complete in Java

Due applicazioni complete in Java CAPITOLO 19 Due applicazioni complete in Java In conclusione del volume sono presentate due applicazioni la cui complessità va oltre quella delle classi finora considerate e che, pur con le dovute limitazioni,

Dettagli

Gestione delle Eccezioni

Gestione delle Eccezioni Gestione delle Eccezioni Condizioni di Errore Una condizione di errore in un programma può avere molte cause Errori di programmazione Divisione per zero, cast non permesso, accesso oltre i limiti di un

Dettagli

CAPITOLO 27 SCAMBIO DI MESSAGGI

CAPITOLO 27 SCAMBIO DI MESSAGGI CAPITOLO 27 SCAMBIO DI MESSAGGI SCAMBIO DI MESSAGGI Sia che si guardi al microkernel, sia a SMP, sia ai sistemi distribuiti, Quando i processi interagiscono fra loro, devono soddisfare due requisiti fondamentali:

Dettagli

Il costrutto monitor

Il costrutto monitor Il Monitor 1 Monitor Definizione del monitor Esempi d uso Realizzazione del costrutto monitor Realizzazione di politiche di gestione delle risorse Chiamate innestate a procedure del monitor Realizzazione

Dettagli

Sviluppo Applicazioni Mobile Lezione 11. Dr. Paolo Casoto, Ph.D - 2012

Sviluppo Applicazioni Mobile Lezione 11. Dr. Paolo Casoto, Ph.D - 2012 + Sviluppo Applicazioni Mobile Lezione 11 + Credits I lucidi di questa lezione sono stati preparati da: Professor Stefano Mizzaro Professor Paolo Coppola e sono stati modificati e completati dal Dr. Paolo

Dettagli

Corso sul linguaggio Java

Corso sul linguaggio Java Corso sul linguaggio Java Modulo JAVA1 1.3 - Le strutture di controllo 1 Prerequisiti Istruzioni semplici Strutture di controllo Scittura di semplici applicazioni Java 2 1 Introduzione In molti casi le

Dettagli

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti GESTIONE DEI PROCESSI 4.1 Processi Concetto di Processo Scheduling di Processi Operazioni su Processi Processi Cooperanti Concetto di Thread Modelli Multithread I thread in diversi S.O. 4.2 Concetto di

Dettagli

Programmazione ad oggetti

Programmazione ad oggetti DAIS Univ. Ca' Foscari Venezia Programmazione ad oggetti Samuel Rota Bulò Informazioni generali Docente: Samuel Rota Bulò @email: srotabul@dais.unive.it Homepage: http://www.dais.unive.it/~srotabul/ ooprogramming2012.html

Dettagli

Cosa è un Sistema Operativo (S.O.)

Cosa è un Sistema Operativo (S.O.) Cosa è un Sistema Operativo (S.O.) Modulo software costituito da un insieme di programmi per: permettere all utente l uso dell elaboratore senza la conoscenza approfondita dell hardware S.O. supporto all

Dettagli

Prova d Esame 07.04.2006 Compito B

Prova d Esame 07.04.2006 Compito B DOMANDA 1 (6 punti) Si analizzi il codice seguente e si scriva l output prodotto dai metodi main public class General { public static String s1 = "ciao"; protected int n; public General() { n = 3; public

Dettagli

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124 UnicastRemoteObject Java RMI fornisce diverse classi base per definire server remoti: UnicastRemoteObject < RemoteServer < RemoteObject dove A < B significa che A è una sottoclasse di B. UnicastRemotObject

Dettagli

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2015-16. Pietro Frasca.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2015-16. Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2015-16 Pietro Frasca Lezione 15 Martedì 24-11-2015 Struttura logica del sottosistema di I/O Processi

Dettagli

Sistema Operativo Compilatore

Sistema Operativo Compilatore MASTER Information Technology Excellence Road (I.T.E.R.) Sistema Operativo Compilatore Maurizio Palesi Salvatore Serrano Master ITER Informatica di Base Maurizio Palesi, Salvatore Serrano 1 Il Sistema

Dettagli

10.7 La classe BitSet... 555 Esercizi di autovalutazione... 558 Risposte agli esercizi di autovalutazione... 559 Esercizi 559

10.7 La classe BitSet... 555 Esercizi di autovalutazione... 558 Risposte agli esercizi di autovalutazione... 559 Esercizi 559 Sommario PREFAZIONE... XI Il nostro approccio didattico... xi Una panoramica del libro... xiv Ringraziamenti... xvii Gli autori... xix Deitel & Associates, Inc.... xx CAPITOLO 1 LA GRAFICA E JAVA2D...

Dettagli

Thread e Concorrenza in Java Swing

Thread e Concorrenza in Java Swing Thread e Concorrenza in Java Swing Esercitazioni di Progettazione del Software A.A. 2013 2014 Alessandro Russo Sapienza Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Dettagli

Eventi di azione. // con interfaccia per eventi di azione

Eventi di azione. // con interfaccia per eventi di azione Eventi di azione (Interfaces ActionListener, Classes ActionEvent) Sono generati quando si premono bottoni, si selezionano voci di menù, si preme invio mentre si scrive in un campo di testo. In awt sono

Dettagli

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java 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)

Dettagli