back to top

Uso dei Thread in Java

Andiamo adesso, con un esempio pratico, a mostrare al lettore in che modo si crea un thread in Java utilizzando ambo le strade percorribili.

Thread come oggetti di sottoclassi della classe Thread

Dato che dovremo estendere la classe Thread, per capire cosa dobbiamo fare bisogna sapere come è fatta la classe Thread che il Java ci mette a disposizione. Nocciolo della questione è il metodo run nel quale inseriremo tutti il nostro codice che desideriamo venga eseguito dal thread. La classe Thread contiene già questo metodo run, ma di fatto è un metodo vuoto. Dunque una volta ereditata la classe Thread dovremo effettuare l’override del metodo run inserendo il codice che vogliamo far eseguire dal nostro thread. Per meglio capire ciò che abbiamo detto mostriamo un piccolo esempio scrivendo il nostro thread:

public class EsempioThread extends Thread {
  public void run() {
    int n;
    for(n=0;n<6;n++) {
      System.out.println("L'indice n è uguale a : " + n);
    }
  }
}
Il thread mostrato nell'esempio è stato ottenuto seguendo ciò che abbiamo detto fino ad adesso ovvero abbiamo esteso la classe Thread del Java e poi abbiamo scritto il nostro codice all'interno del metodo run(). Scriviamo adesso la classe di implementazione del thread per avere la possibilità di mandarlo in esecuzione:
public class ImpementazioneThread {
  public static void main (String[] args) {
    EsempioThread nuovoThread = new EsempioThread();
    nuovoThread.start();
  }
}
Come vediamo abbiamo istanziato un oggetto di tipo "EsempioThread" sfruttando la solita sintassi e poi abbiamo avviato il thread utilizzando la sintassi nuovoThread.start(). E' indispensabile utilizzare il metodo start per lanciare il thread, in quanto non è possibile richiamare direttamente il metodo run() che abbiamo scritto precedentemente. Dunque il metodo start() è una sorta di intermediario che si occuperà di invocare il metodo run() del thread.

Thread come implementazione dell'interfaccia Runnable

Se si segue questa strada di impementazione sostanzialmente dovremo prima creare una classe che implementi l'nterfaccia Runnable ed inserire il codice di nostro interesse nel metodo run(), istanziare l'oggetto relativo a quella classe e poi passare l'oggetto appena creato al costruttore della classe Thread che il Java ci mette a disposizione. Creiamo dunque la classe che implementa l'interfaccia Runnable:

public class EsempioThread implements Runnable {
  public void run() {
    int n;
    for(n=0;n<6;n++) {
      System.out.println("L'indice n è uguale a :" + n);
    }
  }
}
Andiamo adesso a scrivere la classe di implementazione:
public class ImplementazioneThread {
  
  public static void main(String[] args) {
  
    //istanzio l'oggetto della classe che estende
    //l'interfaccia Runnable
    EsempioThread r = new EsempioThread();
  
    //Creo il Thread passando al costruttore della classe
    //Thread del Java l'oggetto della classe
    //che implementa l'interfaccia Runnable
  
    Thread nuovoThread = new Thread(r);
    nuovoThread.start();
  }
}
Come possiamo vedere la struttura dei due metodi è abbastanza simile. Ovviamente se lanciate entrambi i programmi otterrete lo stesso identico risultato dal punto di vista dell'output a video. Ripetiamo, però, che il secondo metodo è da preferirsi, in quanto l'implementazione risulta più fine e offre, allo sviluppatore, di estendere ulteriormente la classe "EsempioThread", cosa che non è possibile utilizzando il primo metodo.

Adesso sono stati forniti al lettore tutte le basi per poter lavorare con i Thread anche in maniera più approfondita e nella prossima lezione vedremo come viene gestita la convivenza di più thread in esecuzione contemporaneamente.

Pubblicitร