Home / Programmazione / Java / Usare i thread in Java con Executor Framework
Mattepuffo

Usare i thread in Java con Executor Framework

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!