MokaByte Numero 04 - Gennaio 1997



 

Step-to-Step nei threads 
di Java

 

di  

Luca Bertoncello
Prima puntata
 

 
 
 


Da questo mese si parlerà dei programmiMultiThread. Vediamo quindi come potrà svolgersi questa serie diarticoli atti a spiegare questa fantastica branca della programmazione.Innanzitutto ci sarà un articolo (lo state leggendo) nel quale sifarà un po' di teoria (si sa che ci vuole), poi vedremo (il meseprossimo) un esempio molto semplice dove si risolverà un problema con la costruzione di alcune piccole applicazioni che svolgeranno partedi esso e ne comunicheranno i risultati al richiedente, quindi ci metteredi fronte a un grosso problema con un risvolto pratico (dopo tanta teoriaci vuole...) e vedremo come si può risolverlo e come effettivamentelo risolveremo. Di questo problema per ora non si accennerà niente,sia perchè dobbiamo ancora definirlo, sia perchè sarebbetroppo complicato da spiegare per una persona digiuna di programmazionedistribuita, come si pensa possa esserlo un ipotetico lettore di questoarticolo.




Piccola spiegazione teorica

Innanzitutto qualche piccola definizione:cos'è un programma MultiThread? È un programma che puòeseguire più parti di se stesso (thread) contemporaneamente. Ineffetti è una conseguenza del multitasking (vedi articolo teoricointroduttivo - ndr).
Infatti esso è la possibilità di un sistema operativo dieseguire più programmi contemporaneamente. Se al posto del programmasi usa solo una procedura (o comunque una sottoparte del programma) eccoche abbiamo il multithread. È questa una definizione un po' semplificata,non me ne vogliano gli esperti e tutti coloro che mettono i puntini sullei, ma era necessaria per fare capire a tutti di cosa si sta parlando. Comeho detto, questo mese ci soffermeremo su una descrizione generale di unprogramma multithread, evitando di entrare nel dettaglio dello sviluppo,quindi non si faranno esempi pratici.


Struttura del programma

Innanzitutto vediamo come deve essere strutturatoun programma per usare queste potenzialità. La base di questo programmadeve essere la classe generica Thread, dalla quale deriveremo la classeche ci serve. Da notare che adesso si ragiona a oggetti, ma in effettiè possibile, per quanto un po' più incasinato creare un programmamultithread in C puro.
Questa classe derivata da "Thread" conterrà due membrifondamentali, che chiameremo Start e Stop. Esse attivano e fermano il thread.A questo punto il programma è praticamente fatto. La funzione mainrichiama tutte le classi thread e le attiva.
Esiste un altro modo per fare la stessa cosa e sfrutta le possibiltà offerte da una rete TCP/IP (come per esempio Internet, anche se basta una Intranet, anche senza nessun WebServer). Si tratta di fare tanti piccoliprogrammini (o programmoni) che girano anche su più macchine e checomunicano tra di loro tramite porte socket (vedi l'articolo sui socketnel secondo numero di questa rivista).
In effetti questa seconda ipotesi fa più parte della programmazione distribuita piuttosto che del multithreading, ma è una possibilità molto interessante, relativamente facile da implementare in Java e che,sopratutto, gode del vantaggio offerto da una rete mondiale come puòessere internet.
Immaginate la possibilità di avere n computer, tutti collegati assieme e che ogni computer abbia la possibilità di eseguire una certa funzione mandando su una porta un certo comando e attendendo il risultato. Il programma vero e proprio si limiterebbe a scomporre il problema in tante parti ea darle in pasto ai vari computer, attendendo poi il risultato. Comodo,vero? In effetti un qualcosa di simile è già stato fattoe quasi tutti lo abbiamo già utilizzato. Sto parlando delle DLL(dinamic link library) che occupano tanto spazio nella directory di Windows.
Essi sono porzioni di codice che possono essere richiamate da piùprogrammi, anche contemporaneamente, e che evitano di dover duplicare procedure,con gran risparmio di spazio.


Idea da sviluppare

Immaginiamo quindi di avere un ipotetico problema(adesso ne prendo uno a caso, ma in seguito, quando si faranno esempi praticise ne studierà uno che abbia qualche utilità) e di volerlorisolvere utilizzando la tecnica precedentemente spiegata.
Innanzitutto bisogna dire che ciò è conveniente quando siha a disposizione una rete di calcolatori, ma la procedura funziona correttamente anche su una sola macchina (solo che così è più lenta). Diciamo per semplicità che il problema è di implementareuna piccola calcolatrice con le due operazioni fondamentali (addizionee moltiplicazione, sottrazione e divisione possono essere ricavate da queste,e anche la moltiplicazione in effetti può essere ricavata dall'addizione,ma semplificherei troppo il programma). Abbiamo quindi due procedure: adde mult.
Diciamo per comodità che esse hanno entrambe due parametri e neritornano sempre uno (questo era naturale). Supponiamo altresì chela add usi la porta 10000 e la mult la porta 10001.A questo punto vediamo un po' come potrebbe essere l'implementazione diqueste funzioni.
Prendiamo ad esempio la add.

Procedura Add

A questo punto vediamo come il nostro programmapuò risolvere il seguente problema:

(a+b)+(c*d)

Naturalmentele procedure citate in questo esempio non sono funzionali in quanto senon si mette un controllo è impossibile eseguire contemporaneamente due somme o due moltiplicazioni in quanto le porte sarebbero occupate.
Per fare ciò occorre che la funzione (thread) si duplichi ogni nuovo operazione che viene proposta.

Quindila vera funzione add sarebbe così:

Bene,per questa puntata direi che ci si può fermare qui. Il prossimo mese vedremo di fare un esempio che effettivamente potrà girareefficaciemente su una macchina (o, meglio ancora, su una rete) e si metterà,finalmente, un po' di codice in modo da rendere pratica la spiegazioneteorica che si è spiegata in questa parte. Il risultato saràun'applicazione che può girare in una qualsiasi macchina di unaipotetica rete (la programmazione distribuita è pensata per le reti,ma si può tranquillamente usare anche sulla stessa macchina), lanciandoi calcoli da fare su una porta di un indirizzo.
Praticamente: a ogni macchina della rete è associato un indirizzoIP e questo verrà usato per identificare la macchina dove si trovala risorsa, poi ci saranno un certo numero di programmini che userannoalcune porte per i dati. L'applicazione usarà l'IP e la porta perfare i suoi calcoli. Nota per gli utilizzatori di macchina "stand-alone":se si mantiene sempre lo stesso IP il programma girerà correttamente,anche se si perderà un po' lo scopo dell'articolo e, naturalmente,un po' di velocità.

 

MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it