back to top

Thread e multi-threading in Java

In questa parte della guida affrontiamo come gestire i thread in Java e, conseguentemente, come sviluppare applicazioni definite multithreading.

Per prima cosa diamo una definizione di thread. In maniera abbastanza approssimativa si può dire che in Java viene creato un thread ogni qual volta mandiamo in esecuzione una classe con il metodo main() all’interno. Dunque, il thread conterrà tutto il blocco di codice contenuto nel metodo main() ed eseguirà in maniera sequenziale ogni singola operazione. Quando facciamo riferimento al multi-threading intendiamo l’esecuzione contemporanea di più thread.

Per indenderci ogni thread si occuperà di risolvere un determinato problema e il fatto di eseguire le operazioni in parallelo, permetterà di ottenere il risultato finale in maniera più veloce.

I thread dunque che lavorano contemporaneamente potranno scambiarsi informazioni ed accedere a risorse condivise in maniera ordinata. Il fatto di scrivere applicazioni multi-threading ha un grosso vantaggio per quanto riguarda l’esecuzione temporale di tutte le varie operazioni ed in alcuni casi l’uso del multi-threading è necessario affinchè l’applicazione abbia un’utilità pratica. Immaginiamo infatti di scrivere un’applicazione che gestisca, su un server, l’invio dei messaggi di una chat. Il funzionamento dell’applicazione sarà il segunete: il server di chat rimane in attesa su una determinata porta ed ad ogni richiesta di connessione da parte di un client viene creato un thread che gestirà l’acquisizione del messaggio scritto dal client e la propagazione dello stesso verso gli altri utenti connessi. Si capisce bene che, senza l’uso dei thread questo tipo di applicazione è molto difficile da realizzare. In questo particolare caso donque avremo un numero di thread pari al numeri di utenti connessi e la particolarità di questa applicazione sarà quella che i thread avranno lo stesso codice d’esecuzione. Nulla vieta però che all’interno di una certa applicazione si possano lanciare più thread con codice d’esecuzione completamente diverso.

Il linguaggio Java permette una gestione dei thread abbastanza semplice fornendoci un punto di partenza non indifferente e mettendo a disposizione degli strumenti molto potenti. Altri linguaggi come il C/C++ non mettono a disposizione questi mezzi così semplificati, ma per raggiungere lo stesso risultato del Java è necessario accedere alle librerie che mette a disposizione ogni singolo sistema operativo per poter gestire il tutto. Ovviamente, questo tipo di approccio, oltre ad essere molto più complesso ha il grosso difetto che un’applicazione che gestirà flussi di codie parallelamente in maniera corretta su un sistema operativo, non funzionerà su un altro, perdendo così il vantaggio di sviluppare applicazioni non dipendente dalla piattaforma.

Tornando alla trattazione dei thread in java possiamo dire che esistono due approcci per la creazione e l’esecuzione di un thread:

  1. E’ possibile creare un Thread come un oggetto di una sottoclasse della classe Thread che il Java ci mette a disposizione.
  2. E’ possibile creare un Thread come un oggetto di una classe che implementi l’interfaccia runnable che, anche questa, ci viene fornita dal Java stesso.
Come detto un thread può essere creato utilizzando indifferentemente una delle due possibilità. Esiste però un’importante differenza tra le due. La prima possibilità infatti è molto più semplice della seconda, ma dato che la nostra classe che rappresenterà il thread sarà una derivazione della classe Thread che il Java ci mette a disposizione, non potremo derivarla ulteriormente. Dunque la nostra classe thread che scriveremo non potrà più essere estesa con delle sottoclassi. Diversa la situazione se si sceglie la seconda modalità, che risulta però un po’ più complessa. In questo modo il thread che andremo a creare non sarà più una sottoclasse della classe Thread del java e ciò permetterà di estendere, con l’ereditarietà, la nostra classe.

Nella prossima lezione vedremo come si costruisce un thread seguendo entrambe le possibilità, elencando i passi necessari da compiere e un po’ di codice d’esempio.

Pubblicitร