giovedì 19 ottobre 2006

Java multi-threading in four steps

Ecco un breve appunto per creare un'applicazione multi-threading in Java:

1) Definire una nuova classe che implementi l'interfaccia Runnable
public void Slave implements Runnable {

}

2) Inserisci un metodo run() in questa classe e inseriscici all'interno il codice che deve essere eseguito in parallelo
public void Slave implements Runnable {

public void run(){

MyApp.executeSomethingStatic();

}

}

3) Nella classe principale, che andrà eseguita parallelamente, inserisci il codice per avviare un nuovo thread della classe Slave:
Thread peasant = new Thread(new Slave()); /* Istanzio un nuovo oggetto di tipo thread */

t.start(); /* Lancio il thread*/

/* il codice presente qui sotto sarà eseguito subito dopo insieme al nuovo thread*/

4) OOOPPs! Chi mi garantisce che la classe principale non acceda alle stesse risorse dell'istanza di slave? (es MyApp)

/* Utilizziamo i metodi sincronizzati */




public class MyApp {


public synchronized void executeSomethingStatic(){


/* Risorsa per un solo thread alla volta */


}


}



Abbiamo implementato un piccolo esempio di thread in Java, utilizzando il metodo classico per questo genere di applicazione in Java.

Esistono però alcune librerie Java SE che permettono di giocherellare con i thread in maniera più simpatica: gli Executors.

Tramite gli executors, per esempio, posso creare un pool di thread facilmente:

public class SwimmingPool{


...


private int poolSize = 20;


private SwimmingPool(){




ExecutorsService pool = newFixedThreadPool(poolSize); /*Creo 20 thread differenti, che saranno utilizzati all'occorrenza, e non saranno terminati fino alla chiusura della vm*/


Future threadResult = pool.submit(MyApp); /* Restituisce il valore di ritorno di MyApp quando verrà terminata*/


...


}



}



Ora rifattorizziamo la classe MyApp... è molto semplice, basta cambiare l'interfaccia implementata: da "runnable" a "callable" e sostuire il metodo run() con call() e il gioco è fatto.

Utilità? Potrebbero essere molto utili per lo sviluppo di un server web, personalmente li ho usati per scrivere un piccolo schedulatore di processi.

Fatemi sapere se ho scritto qualche errore, capita ai migliori... figuriamoci ai peggiori :)

Ciao Piero

Nessun commento:

Posta un commento