package ar.com.javacuriosities.concurrency.fixed_thread_pool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /* * Executors.newFixedThreadPool(): Crea un Pool de threads con el numero indicado por parámetros, * que siempre estarán preparados para procesar tareas. * * El pool maneja también una cola de tareas donde cada Thread coge una tarea de la cola * y empieza a procesarla, cuando termina agarra otra. */ public class Main { private static final int NUMBER_OF_THREADS = 10; public static void main(String[] args) { // Creamos un Pool de 10 hilos ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_THREADS); // Definimos 500 tareas a ser ejecutadas for (int i = 0; i < 500; i++) { Runnable worker = new Task(10000000L + i); executor.execute(worker); } /* * Esto hará que el executor no acepte nuevas tareas y que finalice cuando el thread haya acabado con las 50 tareas */ executor.shutdown(); while (!executor.isTerminated()) { } System.out.println("Finish all the processes"); } /* * Task es una implementación de Runnable la cual recibe un parámetro y su * responsabilidad es contar desde el numero 1 hasta el valor asignado y * después informar el resultado en la consola. */ private static final class Task implements Runnable { private static int index; private final long countUntil; public Task(long countUntil) { this.countUntil = countUntil; } @Override public void run() { long total = 0; for (long i = 1; i < countUntil; i++) { total += i; } index++; System.out.println("Task number:" + index + " - Total: " + total); } } }