Usare i thread in Java con Executor Framework
In Java, per creare un task, generalmente implementiamo l'interfacca Runnable o estendiamo la classe Thread.
Con le ultime versioni (non so precisamente da quale) è possibile agire anche in altra maniera, ovvero usando l'Executor Framework.
La classe Executors (da non confondere con l'interfaccia Executor) ci mette a disposizione tre metodi:
- newCachedThreadPool(): crea un nuovo thread quando serve, ed usa la cache per velocizzarne l'eventuale riuso
- newFixedThreadPool(int nThreads): il numero massimo di thread viene impostato come parametro
- newSingleThreadExecutor(): un unico thread che esegue tutti i task; se "muore" viene ricreato
Andiamo a vedere semplice esempio.
Cominciamo con il classico task che estende Runnable:
public class ExampleTask implements Runnable {
private int taskId = 0;
public ExampleTask(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
for (int i = 1; i < 5; i++) {
try {
System.out.println("Task ID: " + taskId + " - Count: " + i);
} catch (Exception ex) {
System.out.println("Il task con ID " + taskId + " è stato interrotto");
}
}
}
}
Facciamo un semplice ciclo, ed assegnaimo un relativo thread id.
Così richiamiamo il task:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(3);
for (int i = 1; i < 4; i++) {
es.submit(new ExampleTask(i));
}
es.shutdown();
}
}
Avviamo create un pool da un masimo di tre.
Provate a impostare valori diversi per vedere le differenze.
Questo un esempio di output:
Task ID: 1 - Count: 1
Task ID: 1 - Count: 2
Task ID: 3 - Count: 1
Task ID: 2 - Count: 1
Task ID: 3 - Count: 2
Task ID: 3 - Count: 3
Task ID: 1 - Count: 3
Task ID: 3 - Count: 4
Task ID: 2 - Count: 2
Task ID: 1 - Count: 4
Task ID: 2 - Count: 3
Task ID: 2 - Count: 4
Enjoy!
java thread runnable executor executors
Commentami!