ExecutorService: Eseguire Thread a gruppi di N


DOMANDA:

Come posso schedulare i Thread affinché siano eseguiti a gruppi di N?


RISPOSTA:

Esiste un oggetto della classe java.util.Concurrent chiamato ExecutorService che risolve il problema in poche righe di codice. Vediamo un esempio in cui vogliamo svolgere dieci operazioni (ciascuna della durata di mezzo secondo) eseguendole a gruppi di 2.

Classe Operazione:

package executorservice;

public class Operazione implements Runnable {

private long id;

  public Operazione(long id) {
this.id = id;
}

@Override
public void run() {
System.out.print(id + " ");
try {
Thread.sleep(500); // mezzo secondo di pausa
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


La classe di Test:

package executorservice;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestConcurrent {

public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2); // gruppi di due
System.out.print("Id: ");

for(int i = 0; i < 10; i++) { // eseguo 10 volte l'operazione
           Thread thread = new Thread( new Operazione(i), "Operazione "+i );
           executor.execute(thread);
      }

      executor.shutdown();
      while (!executor.isTerminated()) { }
   }
}

L'argomento di Executors.newFixedThreadPool(2) assicura che i Thread siano processati a gruppi di 2.


Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java