Copertina
Autore Harvey M. Deitel
CoautorePaul J. Deitel
Titolo Java. Tecniche avanzate di programmazione, terza edizione
EdizioneApogeo, Milano, 2006, Education , pag. 842, ill., cop.fle., dim. 168x240x39 mm , Isbn 978-88-503-2389-0
OriginaleJava How to Program, Sixth Edition [2005]
TraduttoreRoberto Ranon, Andrea Baruzzo
LettoreCorrado Leonardo, 2006
Classe informatica: linguaggi
PrimaPagina


al sito dell'editore


per l'acquisto su IBS.IT

per l'acquisto su BOL.IT

per l'acquisto su AMAZON.IT

 

| << |  <  |  >  | >> |

Indice

PREFAZIONE                                                XI
Il nostro approccio didattico                             xi
Una panoramica del libro                                xiii
Ringraziamenti                                          xvii
Gli autori                                                xx
Deitel & Associates, Inc.                                xxi

CAPITOLO 1:
I COMPONENTI DELLE INTERFACCE UTENTE GRAFICHE: PARTE I     1

1.1  Introduzione                                          1
1.2  Un semplice esempio di input-output realizzato
     mediante GUI                                          2
1.3  Una panoramica dei componenti Swing                   5
1.4  Visualizzare testo e immagini in una finestra         8
1.5  I campi di testo e la gestione degli eventi          13
1.6  Tipi di eventi GUI comuni e interfacce Listener
     (ascoltatore)                                        20
1.7  Come funziona la gestione degli eventi               23
1.8  I pulsanti                                           24
1.9  Pulsanti che mantengono lo stato                     28
     1.9.1   JCheckBox                                    28
     1.9.2   JRadioButton                                 31
1.10 Caselle combinate                                    35
1.11 Gli elenchi                                          38
1.12 Gli elenchi a selezione multipla                     41
1.13 La gestione degli eventi del mouse                   44
1.14 Classi adapter                                       49
1.15 Una sottoclasse di JPanel                            53
1.16 La gestione degli eventi della tastiera              57
1.17 I gestori di layout                                  60
     1.17.1  FlowLayout                                   62
     1.17.2  BorderLayout                                 65
     1.17.3  GridLayout                                   68
1.18 I pannelli                                           70
1.19 Aree di testo                                        72
1.20 Riepilogo                                            75
     Esercizi di autovalutazione                          76
     Soluzione agli esercizi di autovalutazione           77
     Esercizi                                             77
     (Esercizio facoltativo) Caso di studio Interfaccia
     utente e grafica: estendere l'interfaccia            80

CAPITOLO 2: LA GRAFICA E JAVA2D                           83

2.1  Introduzione                                         83
2.2  I contesti e gli oggetti grafici                     85
2.3  Controllare i colori                                 86
2.4  Controllare i tipi di caratteri                      94
2.5  Disegnare linee, rettangoli e ovali                 100
2.6  Disegnare archi                                     104
2.7  Disegnare poligoni e polilinee                      106
2.8  Java2D API                                          109
2.9  Riepilogo                                           117
     Esercizi di autovalutazione                         117
     Risposte agli esercizi di autovalutazione           118
     Esercizi                                            118
     (Esercizio facoltativo) Caso di studio interfaccia
     utente e grafica: aggiungere Java2D                 121

CAPITOLO 3: LA GESTIONE DELLE ECCEZIONI                  125

3.1  Introduzione                                        125
3.2  Introduzione alla gestione delle eccezioni          126
3.3  Un esempio senza la gestione delle eccezioni        127
3.4  Gestione delle eccezioni ArithmeticException
     e InputMismatchException                            129
3.5  Quando usare la gestione delle eccezioni            136
3.6  La gerarchia delle eccezioni in Java                136
3.7  La clausola finally                                 139
3.8  Riavvolgimento dello stack                          144
3.9  printStackTrace, getStackTrace e getMessage         146
3.10 Eccezioni concatenate                               149
3.11 Dichiarare nuovi tipi di eccezioni                  150
3.12 Precondizioni e postcondizioni                      152
3.13 Asserzioni                                          152
3.14 Riepilogo                                           154
     Esercizi di autovalutazione                         155
     Risposte agli esercizi di autovalutazione           155
     Esercizi                                            156

CAPITOLO 4: FILE E STREAM                                159

4.1  Introduzione                                        159
4.2  La gerarchia dei dati                               160
4.3  File e stream                                       162
4.4  La classe File                                      164
4.5  Creare un file ad accesso sequenziale               169
     4.5.1 Creare un file di testo ad accesso sequenziale169
     4.5.2 Leggere dati da un file di testo
           ad accesso sequenziale                        176
     4.5.3 Caso di studio: un programma per
           l'interrogazione dei crediti                  179
     4.5.4 Aggiornare un file ad accesso sequenziale     185
4.6  La serializzazione degli oggetti                    185
     4.6.1 Creare un file ad accesso sequenziale usando
           la serializzazione degli oggetti              186
4.7  I file ad accesso causale                           195
     4.7.1 Creare un file ad accesso casuale             196
     4.7.2 Scrivere dati in un file ad accesso casuale   201
     4.7.3 Leggere dati sequenzialmente da un file
           ad accesso casuale                            205
     4.7.4 Un caso di studio: un programma per
           l'elaborazione delle transazioni              208
4.8  Ulteriori classi del package java.io                217
4.9  Aprire dei file con JFileChooser                    219
4.10 Riepilogo                                           223
     Esercizi di autovalutazione                         224
     Risposte agli esercizi di autovalutazione           225
     Esercizi                                            226

CAPITOLO 5: LA RICORSIONE                                231

5.1  Introduzione                                        231
5.2  I concetti fondamentali della ricorsione            231
5.3  Un esempio di ricorsione: il fattoriale             233
5.4  Un esempio che usa la ricorsione: la serie di
     Fibonacci                                           236
5.5  La ricorsione e la pila delle chiamate              239
5.6  Ricorsione e iterazione                             241
5.7  Permutazione di stringhe                            243
5.8  Le Torri di Hanoi                                   248
5.9  I frattali                                          251
5.10 Il backtracking ricorsivo                           262
5.11 Riepilogo                                           263
5.12 Risorse Internet e World Wide Web                   264
     Esercizi di autovalutazione                         265
     Risposte agli esercizi di autovalutazione           266
     Esercizi                                            267

CAPITOLO 6: ALGORITMI DI RICERCA E ORDINAMENTO           271

6.1  Introduzione                                        271
6.2  Algoritmi di ricerca                                272
     6.2.1 La ricerca lineare                            272
     6.2.2 La ricerca binaria                            277
6.3  Algoritmi di ordinamento                            283
     6.3.1 Selection sort                                283
     6.3.2 Insertion sort                                287
     6.3.3 Merge sort                                    291
6.4  Invarianti                                          297
6.5  Riepilogo                                           299
     Esercizi di autovalutazione                         299
     Risposte agli esercizi di autovalutazione           299
     Esercizi                                            300

CAPITOLO 7: LE STRUTTURE DATI                            303

7.1  Introduzione                                        303
7.2  Classi wrapper sui tipi primitivi                   304
7.3  Autoboxing e auto-unboxing                          305
7.4  Classi auto-referenziali                            306
7.5  Allocazione dinamica della memoria                  306
7.6  Liste concatenate                                   307
7.7  Le pile                                             317
7.8  Le code                                             322
7.9  Gli alberi                                          325
7.10 Riepilogo                                           332
     Esercizi di autovalutazione                         332
     Risposte agli esercizi di autovalutazione           333
     Esercizi                                            334
     Sezione speciale: costruite il vostro computer      339

CAPITOLO 8: I TIPI GENERICI                              355

8.1  Introduzione                                        355
8.2  Motivazione per i metodi generici                   356
8.3  I metodi generici: implementazione e
     traduzione a tempo di compilazione                  358
8.4  Ulteriori problematiche: metodi che usano
     un parametro tipo come tipo di ritorno              362
8.5  Sovraccarico dei metodi generici                    365
8.6  Classi generiche                                    366
8.7  I tipi "raw"                                        377
8.8  I "caratteri jolly" nei metodi con parametri tipo   382
8.9  I tipi generici e l'ereditarietà                    386
8.10 Riepilogo                                           387
8.11 Risorse Internet e World Wide Web                   387
     Esercizi di autovalutazione                         387
     Risposte agli esercizi di autovalutazione           388
     Esercizi                                            388

CAPITOLO 9: LE COLLEZIONI                                391

9.1  Introduzione                                        391
9.2  Una panoramica delle collezioni                     392
9.3  La classe Arrays                                    393
9.4  L'interfaccia Collection e la classe Collections    396
9.5  Le liste                                            397
     9.5.1 ArrayList e Iterator                          398
     9.5.2 LinkedList                                    400
     9.5.3 Vector                                        405
9.6  Algoritmi                                           410
     9.6.1 L'algoritmo sort                              410
     9.6.2 L'algoritmo shuffle                           414
     9.6.3 Gli algoritmi reverse, fill, copy, max e min  417
     9.6.4 L'algoritmo binarySearch                      419
     9.6.5 Gli algoritmi addAll, frequency e disjoint    421
9.7  La classe Stack del package java.util               423
9.8  La classe PriorityQueue e l'interfaccia Queue       426
9.9  Insiemi                                             428
9.10 Le mappe                                            431
9.11 La classe Properties                                435
9.12 Wrapper di sincronizzazione                         439
9.13 Collezioni non modificabili                         439
9.14 Implementazioni astratte                            440
9.15 Riepilogo                                           440
     Esercizi di autovalutazione                         441
     Risposte agli esercizi di autovalutazione           441
     Esercizi                                            441

CAPITOLO 10: INTRODUZIONE ALLE APPLET JAVA               445

10.1 Introduzione                                        445
10.2 Applet dimostrative fornite con il
     Java Software Development Kit                       446
10.3 Una semplice applet Java: disegnare una stringa     451
     10.3.1 Eseguire un'applet nel contenitore
            appletviewer                                 453
     10.3.2 Eseguire un'applet in un browser Web         455
10.4 Il ciclo di vita delle applet                       456
10.5 Inizializzare una variabile di istanza mediante
     il metodo init                                      457
10.6 Il modello di sicurezza "sandbox"                   459
10.7 Risorse riguardanti le applet disponibili sul Web   460
10.8 Riepilogo                                           461
     Esercizi di autovalutazione                         461
     Risposte agli esercizi di autovalutazione           461
     Esercizi                                            461

CAPITOLO 11: LA MULTIMEDIALITΐ: APPLET E APPLICAZIONI    463

11.1 Introduzione                                        463
11.2 Caricare, visualizzare e riscalare le immagini      464
11.3 Animare una sequenza di immagini                    467
11.4 Mappe di immagini                                   473
11.5 Caricare e riprodurre i clip audio                  476
11.6 Riprodurre video e altri formati multimediali
     usando Java Media Framework                         479
11.7 Riepilogo                                           484
11.8 Risorse in Internet e World Wide Web                485
     Esercizi di autovalutazione                         486
     Risposte agli esercizi di autovalutazione           487
     Esercizi                                            487
     Sezione speciale: progetti multimediali avanzati    488

CAPITOLO 12:
I COMPONENTI DELLE INTERFACCE UTENTE GRAFICHE: PARTE II  491

12.1 Introduzione                                        491
12.2 Slider                                              492
12.3 Le finestre: note aggiuntive                        496
12.4 Usare i menu all'interno dei frame                  497
12.5 I menu popup                                        506
12.6 Pluggable Look-and-Feel                             509
12.7 Interfacce con documenti multipli                   513
12.8 Livelli di componenti GUI                           518
12.9 I gestori di layout: BoxLayout e GridBagLayout      520
12.10Riepilogo                                           535
     Esercizi di autovalutazione                         535
     Risposte agli esercizi di autovalutazione           536
     Esercizi                                            536

CAPITOLO 13: IL MULTITHREADING                           539

13.1  Introduzione                                       539
13.2  Gli stati dei thread: il ciclo di vita di un thread541
13.3  Le priorità e la schedulazione dei thread          543
13.4  Creare ed eseguire i thread                        544
13.5  La sincronizzazione dei thread                     549
13.6  La relazione produttore/consumatore senza
      sincronizzazione                                   551
13.7  La relazione produttore/consumatore con
      sincronizzazione                                   559
13.8  La relazione produttore/consumatore:
      il buffer circolare                                565
13.9  La relazione produttore/consumatore:
      ArrayBlockingQueue                                 573
13.10 Il multithreading con le GUI                       576
13.11 Altre classi e interfacce di java.util.concurrent  582
13.12 I monitor e i lock sui monitor                     583
13.13 Riepilogo                                          589
      Esercizi di autovalutazione                        589
      Risposte agli esercizi di autovalutazione          590
      Esercizi                                           591

CAPITOLO 14: JAVA E LE RETI                              593

14.1  Introduzione                                       593
14.2  Manipolare gli URL                                 594
14.3  Leggere un file su un server Web                   600
14.4  Costruire un semplice server usando i socket
      di flusso                                          603
14.5  Costruire un semplice client usando i socket
      di flusso                                          605
14.6  Interazioni client/server con connessioni socket
      di flusso                                          606
14.7  Interazione client/server senza connessione
      con datagrammi                                     619
14.8  Tris client/server usando un server multithreaded  627
14.9  La rete e la sicurezza                             642
14.10 Caso di studio: DeitelMessenger Chat Server
      e Client                                           643
      14.10.1 La classe DeitelMessengerServer e
              le classi di supporto                      643
      14.10.2 DeitelMessengerClient e classi di supporto 652
14.11 Riepilogo                                          670
      Esercizi di autovalutazione                        670
      Risposte agli esercizi di autovalutazione          671
      Esercizi                                           671

CAPITOLO 15: COLLEGARE JAVA AI DATABASE CON JDBC         675

15.1  Introduzione                                       675
15.2  I database relazionali                             676
15.3  Una panoramica dei database relazionali:
      il database books                                  677
15.4  SQL    681
      15.4.1 Le query SELECT                             681
      15.4.2 La clausola WHERE                           682
      15.4.3 La clausola ORDER BY                        684
      15.4.4 L'uso di INNER JOIN per combinare i dati
             di più tabelle                              686
      15.4.5 L'istruzione INSERT                         687
      15.4.6 L'istruzione UPDATE                         688
      15.4.7 L'istruzione DELETE                         689
15.5  Istruzioni per installare MySQL e MySQL Connector/J689
15.6  Istruzioni per impostare un account utente MySQL   690
15.7  Creare il database books con MySQL                 691
15.8  Manipolare i database con JDBC                     691
      15.8.1 Connettersi a un database e interrogarlo    691
      15.8.2 Interrogare il database books               697
15.9  Le procedure memorizzate (stored procedure)        708
15.10 L'interfaccia RowSet                               709
15.11 Riepilogo                                          712
15.12 Risorse Internet e World Wide Web                  712
      Esercizi di autovalutazione                        713
      Risposte agli esercizi di autovalutazione          713
      Esercizi                                           713

CAPITOLO 16: I SERVLET                                   717

16.1  Introduzione                                       717
16.2  Panoramica e architettura dei servlet              719
      16.2.1 L'interfaccia Servlet e il ciclo di vita
             dei servlet                                 719
      16.2.2 La classe HTTPServlet                       721
      16.2.3 L'interfaccia HttpServletRequest            722
      16.2.4 L'interfaccia HttpServletResponse           723
16.3  Impostare il server Apache Tomcat                  724
16.4  La gestione delle richieste HTTP get               726
      16.4.1 Installare un'applicazione Web              731
16.5  Gestire una richiesta HTTP get contenente dati     735
16.6  Gestire le richieste HTTP post                     738
16.7  Ridirigere le richieste ad altre risorse           741
16.8  Applicazioni multi-livello: usare JDBC da un
      servlet                                            745
16.9  File welcome (file di benvenuto)                   752
16.10 Riepilogo                                          754
16.11 Risorse Internet e World Wide Web                  754
      Esercizi di autovalutazione                        755
      Risposte agli esercizi di autovalutazione          755
      Esercizi                                           755

CAPITOLO 17: JAVA SERVER PAGES (JSP)                     757

17.1  Introduzione                                       757
17.2  Panoramica di Java Server Pages                    758
17.3  Il primo esempio di Java Server Page               759
17.4  Oggetti impliciti                                  761
17.5  Gli script                                         761
      17.5.1 Componenti degli script                     762
      17.5.2 Esempio di script                           763
17.6  Azioni standard                                    767
      17.6.1 L'azione                       767
      17.6.2 L'azione                       772
      17.6.3 L'azione                       775
17.7  Le direttive                                       781
      17.7.1 La direttiva page                           781
      17.7.2 La direttiva include                        783
17.8  Caso di studio: guest book                         785
17.9  Riepilogo                                          797
17.10 Risorse Internet e World Wide Web                  797
      Esercizi di autovalutazione                        797
      Risposte agli esercizi di autovalutazione          798
      Esercizi                                           798

CAPITOLO 18: LA FORMATTAZIONE DELL'OUTPUT                799

18.1  Introduzione                                       799
18.2  I flussi (stream)                                  799
18.3  La formattazione dell'output usando printf         800
18.4  Stampare valori interi                             800
18.5  Stampare valori a virgola mobile                   802
18.6  Stampare stringhe e caratteri                      803
18.7  Stampare date e ore                                804
18.8  Altri caratteri di conversione                     807
18.9  Stampare con i campi ampiezza e precisione         807
18.10 Usare i flag nelle stringhe di formato di printf   810
18.11 Stampare usando gli indici d'argomento             815
18.12 Stampare letterali e sequenze di escape            815
18.13 Formattare l'output con la classe Formatter        816
18.14 Riepilogo                                          817
      Esercizi di autovalutazione                        817
      Risposte agli esercizi di autovalutazione          818
      Esercizi                                           819

APPENDICE A: UNICODE                                     821

RISORSE INTERNET E WORLD WIDE WEB                        829

INDICE ANALITICO                                         837


 

 

| << |  <  |  >  | >> |

Pagina XI

Prefazione


Benvenuti nel mondo di Java! Alla Deitel & Associates, scriviamo libri di testo per corsi di programmazione di livello universitario e lavoriamo molto per mantenere i nostri libri aggiornati. Questo libro, Java, Tecniche avanzate di programmazione, completa l'esposizione del linguaggio che abbiamo iniziato in Java, Fondamenti di programmazione. Questi due libri possiedono tutto quanto è richiesto da professori e studenti per un'esperienza di apprendimento del linguaggio Java che sia informativa, interessante, stimolante e divertente. Questo libro è aggiornato all'ultima versione di Java, Java 2 Platform, Standard Edition (J2SE), versione 5.0. Rispetto all'edizione precedente, abbiamo aggiornato e messo a punto il testo, la strategia didattica e lo stile del codice. Più avanti nella prefazione troverete una panoramica del libro, che aiuta sia i docenti, sia gli studenti e i professionisti a rendersi conto di quanto il testo copra il linguaggio Java.

Che siate un docente, uno studente, un programmatore professionista o principiante, questo libro ha molto da offrirvi. Java è un linguaggio di programmazione per sviluppare applicazioni informatiche industriali per dispositivi che vanno dai telefoni cellulari e dai PDA fino ai più grandi server aziendali. Abbiamo controllato attentamente il nostro testo rispetto alla Specifica del linguaggio Java (disponibile sul sito Web java.sun.com/docs/books/jls/index.html). Quindi, i programmi che creerete studiando questo testo dovrebbero funzionare con ogni piattaforma Java compatibile con J2SE 5.0.

Oltre ai commenti che ci sono giunti dalle revisioni dell'edizione precedente, abbiamo integrato nel testo finale i commenti di 44 noti professionisti del mondo accademico e dell'industria, che vengono elencati nel paragrafo Ringraziamenti. Concluderemo questa prefazione con informazioni sugli autori e sulla Deitel & Associates, Inc.


Il nostro approccio didattico

Questo libro contiene un'ampia varietà di esempi, esercizi e progetti che prendono spunto da molte situazioni, e che offrono agli studenti la possibilità di risolvere problemi reali. Il libro prende in esame i principi della progettazione del software, insistendo sull'importanza della chiarezza dei programmi ed evitando l'uso di terminologia complessa a favore di esempi chiari e diretti, il cui codice è stato testato sulle piattaforme Java più diffuse.

Imparare Java usando l'approccio LIVE-CODE

Il libro presenta una grande quantità di esempi di codice Java. Ogni nuovo argomento viene presentato nell'ambito di un programma Java completo e funzionante, seguito sempre da una o più finestre che mostrano l'input/output del programma in questione. Viene quindi usato il linguaggio di programmazione per insegnare il linguaggio di programmazione, e la lettura di questi programmi offre un'esperienza molto simile alla loro scrittura ed esecuzione reale su di un computer.

Tutto il codice presente nel libro si trova in Internet, all'indirizzo www.apogeonline.com/libri/88-503-2389-1/scheda. Il nostro consiglio è quello di scaricare tutto il codice, eseguendo poi ogni singolo programma via via che appare nel testo. Potete anche modificare il codice degli esempi e vedere cosa succede, e imparare così il linguaggio programmando.

Obiettivi

Ogni capitolo inizia con la presentazione degli Obiettivi. Gli studenti possono così sapere in anticipo ciò che andranno ad apprendere e, alla fine della lettura del capitolo, potranno verificare se hanno raggiunto o meno questi obiettivi.

Migliaia di righe di codice in molti programmi di esempio

Le funzionalità di Java vengono presentate nell'ambito di programmi Java completi e funzionanti. Ogni programma è seguito dalle immagini degli output che vengono prodotti, così che gli studenti possano assicurarsi della correttezza dei risultati. I programmi presentati vanno da poche linee di codice a esempi composti da varie centinaia di righe di codice.

Centinaia di illustrazioni e figure

Il libro offre un'ampia varietà di grafici, immagini e output di programmi. Abbiamo convertito tutti i diagrammi di flusso in diagrammi di attività UML. Usiamo anche diagrammi di classe UML per modellare le relazioni tra classi che incontriamo nel testo.

Centinaia di suggerimenti per il programmatore

Il libro offre molti suggerimenti riguardanti la programmazione per aiutare gli studenti a concentrarsi sugli aspetti più importanti dello sviluppo di programmi. Questi consigli vengono forniti attraverso le sezioni chiamate Buona abitudine, Errore tipico, Collaudo e messa a punto, L'esperienza dell'utente, Obiettivo efficienza, Obiettivo portabilità e Ingegneria del software.

| << |  <  |  >  | >> |

Pagina 445

CAPITOLO 10

Introduzione alle applet Java


Obiettivi

• Comprendere la differenza tra un'applet e un'applicazione

• Osservare alcune delle capacità più interessanti di Java attraverso le applet dimostrative fornite con il JDK

• Imparare a scrivere delle semplici applet Java

• Imparare a scrivere dei semplici documenti HTML (HyperText Markup Language), per caricare ed eseguire un'applet in un contenitore

• Imparare cinque metodi che sono chiamati automaticamente da un contenitore di un'applet durante il ciclo di vita dell'applet stessa


10.1 Introduzione

[Nota: questo capitolo e i suoi esercizi sono stati intenzionalmente concepiti in modo da risultare concisi e semplici per tutti i lettori che volessero imparare le nozioni di base sulle applet già dopo aver letto i primi capitoli del libro. Nel seguito del volume avremo modo di discutere delle applet più complesse, ad esempio nel capitolo 11 dedicato al multimedia, oppure nei capitoli 13 e 14, dedicati rispettivamente al multithreading e alla programmazione di rete.]

Questo capitolo fornisce un'introduzione alle applet Java, un tipo di programma che può essere inserito in un documento HyperText Markup Language (HTML), cioè una pagina Web. Quando un browser carica una pagina Web contenente un'applet, questa viene caricata ed eseguita. Ciò permette di creare dei programmi che possono essere eseguiti semplicemente caricando la pagina Web appropriata.

Il browser che esegue l'applet viene genericamente detto contenitore dell'applet (applet container). Il JDK include il contenitore di applet appletviewer che useremo nel libro per collaudare le applet durante lo sviluppo, prima di inserirle in una pagina Web. Se volete eseguire le vostre applet all'interno di un browser Web, sappiate comunque che alcuni Web browser non supportano direttamente la piattaforma Java 5.0. Potete visitare il sito java.com dal quale potete poi scaricare il run-time Java (IRE) per la versione 5.0 adatta al vostro browser. Sono attualmente supportati diversi browser, quindi ci sono buone probabilità che tra essi ci sia anche quello che state usando.

| << |  <  |  >  | >> |

Pagina 539

CAPITOLO 13

Il multithreading


Obiettivi

• Capire la programmazione con il multithreading

• Capire come il multithreading sia in grado di migliorare le prestazioni

• Comprendere il ciclo di vita di un thread

• Comprendere il concetto di priorità e schedulazione dei thread

• Comprendere come creare, gestire e distruggere dei thread

• Capire la sincronizzazione dei thread

• Conoscere le relazioni produttore-consumatore e capire come implementarle con i thread

• Saper visualizzare l'output da thread multipli in una GUI Swing


13.1 Introduzione

Sarebbe bello se tutti potessimo fare "una sola cosa per volta" e "farla bene", ma purtroppo non è così che va il mondo. Il corpo umano esegue un'enorme quantità di operazioni in parallelo o, come si dirà spesso all'interno di questo capitolo, in modo concorrente. La respirazione, la circolazione sanguigna e la digestione, per esempio, possono tutte avvenire in modo concorrente. Tutti i sensi (vista, tatto, olfatto, gusto e udito) possono essere impiegati in parallelo. Allo stesso modo, anche i computer eseguono più operazioni in modo concorrente, come compilare un programma, spedire un file e ricevere messaggi di posta elettronica. [Nota: solo i computer che hanno più di un processore possono eseguire delle operazioni in modo realmente concorrente. I sistemi operativi usano varie tecniche per simulare la concorrenza su computer con un singolo processore, ma su tali computer può essere eseguito solo un compito alla volta].

La maggior parte dei linguaggi di programmazione non permette ai programmatori di specificare attività concorrenti. Questi linguaggi, infatti, forniscono generalmente solo un gruppo di strutture di controllo che permettono ai programmatori di eseguire un'azione alla volta, per passare poi all'azione successiva dopo che quella precedente è stata completata. Storicamente, la concorrenza è stata implementata come primitiva del sistema operativo disponibile solo a programmatori di sistema esperti.

Il linguaggio di programmazione Ada, sviluppato dal Dipartimento della Difesa degli Stati Uniti, fu il primo linguaggio a fornire primitive che supportassero la concorrenza, per produrre applicazioni di controllo di dispositivi militari. Nonostante Ada si sia evoluto negli anni, esso non ha mai trovato grandi consensi nell'ambito accademico e commerciale.

Java è oggi l'unico, tra i linguaggi di programmazione più diffusi, che permette ai programmatori di applicazioni di gestire con facilità le primitive per la gestione della concorrenza. Il programmatore specifica che le applicazioni contengono dei thread di esecuzione, ognuno indicante una porzione di programma che può essere eseguita parallelamente ad altri thread. Questa funzionalità, chiamata multithreading, offre ai programmatori Java potenzialità non disponibili nei linguaggi C e C++, su cui Java è in parte basato. [Nota su molte piattaforme, i programmi C e C++ possono eseguire il multithreading usando librerie di codice specifiche per la piattaforma].

| << |  <  |  >  | >> |

Pagina 593

CAPITOLO 14

Java e le reti


Obiettivi

• Comprendere il ruolo degli URL, dei socket e dei datagrammi nell'ambito della gestione delle reti in Java

• Implementare le applicazioni Java con funzionalità di rete usando socket e datagrammi

• Capire come implementare i client e i server Java che comunicano tra di loro

• Capire come implementare applicazioni collaborative basate sulle reti

• Costruire un server che opera in multithreading


14.1 Introduzione

C'è molto interesse intorno a Internet e al World Wide Web. Internet "lega" il mondo dell'informazione. Il World Wide Web rende Internet facile da usare e gli fornisce le capacità multimediali. Le organizzazioni vedono Internet e il World Wide Web come cruciali nelle proprie strategie riguardo i sistemi informativi. Java fornisce diverse funzionalità legate alle reti che rendono semplice lo sviluppo di applicazioni basate su Internet e sul World Wide Web, e permette ai programmi di cercare informazioni e collaborare con programmi in esecuzione su altri computer nel mondo, in una nazione o all'interno di un'organizzazione. Java permette inoltre alle applet e alle applicazioni di comunicare tra loro (rispettando i vincoli di sicurezza).

Le funzionalità di rete di Java sono raggruppate in diversi package. Le funzionalità di base sono dichiarate dalle classi e dalle interfacce del package java.net, attraverso le quali Java offre comunicazioni basate su flussi che permettono alle applicazioni di vedere le reti come flussi di dati. Le classi e le interfacce del package java.net offrono anche comunicazioni basate su pacchetti per trasmettere pacchetti individuali di informazioni, usati per esempio per trasmettere audio e video attraverso Internet. In questo capitolo, vedremo come creare e manipolare dei socket e come comunicare con pacchetti di dati.

La nostra discussione delle reti si focalizzerà su entrambe le parti di una relazione client/server. Il client richiede che venga eseguita qualche azione, il server la esegue e risponde al client. Un'implementazione comune del modello richiesta-risposta è quella tra i browser Web e i server Web. Quando l'utente seleziona un sito Web da visitare con il browser (l'applicazione client), viene spedita una richiesta al server Web appropriato (l'applicazione server). Il server di solito risponde al client spedendogli una pagina HTML appropriata.

Parleremo inoltre delle comunicazioni Java basate su socket, che permettono a un programma di leggere da o di scrivere in un socket proprio come se si trattasse di un file. Vedrete inoltre come creare e utilizzare i socket. Java offre due tipi di socket: di flusso (stream socket) e di datagramma (datagram socket). Nel primo caso, un processo stabilisce una connessione con un altro processo; mentre la connessione è in atto, i dati scorrono tra i processi attraverso un flusso continuo. Questi socket forniscono un servizio orientato alla connessione. Il protocollo utilizzato per la trasmissione è il noto TCP (Transmission Control Protocol).

Nel caso dei socket di datagramma, vengono trasmessi pacchetti di informazioni. Questo protocollo non è il più adatto a tutti i programmi perché, diversamente da TCP, il protocollo utilizzato, vale a dire UDP (User Datagram Protocol), è un servizio senza connessione, che non garantisce che i pacchetti giungano a destinazione nel modo corretto: i pacchetti possono arrivare nell'ordine sbagliato, oppure andare persi, oppure ancora essere duplicati. Con il protocollo UDP, quindi, è necessaria una notevole attività di programmazione aggiuntiva per gestire questi problemi. I socket di flusso e il protocollo TCP sono quindi più adatti alla maggior parte dei programmi Java.