Interfaz ExecutorService

Una interfaz java.util.concurrent.ExecutorService es una subinterfaz de la interfaz Executor, y agrega características para administrar el ciclo de vida, tanto de las tareas individuales como del ejecutor mismo.

Métodos ExecutorService

No Señor. Método y descripción
1

boolean awaitTermination(long timeout, TimeUnit unit)

Se bloquea hasta que todas las tareas hayan completado la ejecución después de una solicitud de cierre, o se agote el tiempo de espera o se interrumpa el hilo actual, lo que ocurra primero.

2

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)

Ejecuta las tareas dadas, devolviendo una lista de futuros con su estado y resultados cuando todo se completa.

3

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

Ejecuta las tareas dadas, devolviendo una lista de Futuros con su estado y resultados cuando todo se completa o el tiempo de espera expira, lo que ocurra primero.

4

<T> T invokeAny(Collection<? extends Callable<T>> tasks)

Ejecuta las tareas dadas, devolviendo el resultado de una que se ha completado con éxito (es decir, sin lanzar una excepción), si alguna lo hace.

5

<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

Ejecuta las tareas dadas, devolviendo el resultado de una que se ha completado con éxito (es decir, sin lanzar una excepción), si alguna lo hace antes de que transcurra el tiempo de espera dado.
6

boolean isShutdown()

Devuelve verdadero si este ejecutor se ha cerrado.

7

boolean isTerminated()

Devuelve verdadero si todas las tareas se completaron después del cierre.

8

void shutdown()

Inicia un apagado ordenado en el que se ejecutan las tareas enviadas anteriormente, pero no se aceptarán nuevas tareas.

9

List<Runnable> shutdownNow()

Intenta detener todas las tareas en ejecución activa, detiene el procesamiento de las tareas en espera y devuelve una lista de las tareas que estaban en espera de ejecución.

10

<T> Future<T> submit(Callable<T> task)

Envía una tarea de devolución de valor para su ejecución y devuelve un Futuro que representa los resultados pendientes de la tarea.

11

Future<?> submit(Runnable task)

Envía una tarea ejecutable para su ejecución y devuelve un futuro que representa esa tarea.

12

<T> Future<T> submit(Runnable task, T result)

Envía una tarea ejecutable para su ejecución y devuelve un futuro que representa esa tarea.

Ejemplo

El siguiente programa TestThread muestra el uso de la interfaz ExecutorService en un entorno basado en subprocesos.

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

public class TestThread {

   public static void main(final String[] arguments) throws InterruptedException {
      ExecutorService executor = Executors.newSingleThreadExecutor();

      try {
         executor.submit(new Task());
         System.out.println("Shutdown executor");
         executor.shutdown();
         executor.awaitTermination(5, TimeUnit.SECONDS);
      } catch (InterruptedException e) {
         System.err.println("tasks interrupted");
      } finally {

         if (!executor.isTerminated()) {
            System.err.println("cancel non-finished tasks");
         }
         executor.shutdownNow();
         System.out.println("shutdown finished");
      }
   }

   static class Task implements Runnable {
      
      public void run() {
         
         try {
            Long duration = (long) (Math.random() * 20);
            System.out.println("Running Task!");
            TimeUnit.SECONDS.sleep(duration);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }	   
}

Esto producirá el siguiente resultado.

Salida

Shutdown executor
Running Task!
shutdown finished
cancel non-finished tasks
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Thread.java:302)
	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:328)
	at TestThread$Task.run(TestThread.java:39)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:662)