Servicio de ejecutor programado con un solo hilo
Tengo un código de muestra para el Servicio de ejecutor programado, tomado del sitio de Oracle. Crea un ScheduledExecutorService con un tamaño de grupo de núcleo o 1. Realiza 2 trabajos: primero inicia una tarea repetida ejecutada a intervalos fijos y luego mata la misma tarea y el servicio mismo después de un retraso.
ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(1);
//This will keep executing the task at fixed interval
ScheduledFuture<?> futureTask = scheduledService.scheduleAtFixedRate(new RepeatedTask(), initialDelay, interval, TimeUnit.SECONDS);
//A future task is returned which can be used to cancel the execution after sometime
//Here we will cancel our repeated task after 100 seconds
scheduledService.schedule(new TaskStopper(futureTask, scheduledService), 100, TimeUnit.SECONDS);
El código de tarea repetido:
public class RepeatedTask implements Runnable{
int count = 0;
@Override
public void run() {
count++;
System.out.println(count + ". Beep");
}
}
La tarea de parada
@Override
public void run() {
mFutureTask.cancel(true);
System.out.println("Task stopped");
mExecutorService.shutdownNow();
boolean shutDown = mExecutorService.isShutdown();
if(shutDown) {
System.out.println("Executor shutdown");
}else {
System.out.println("Executor not shutdown");
}
}
Quiero entender cómo funciona con un solo hilo en el grupo de hilos. Dado que nuestro servicio ejecutor realiza dos tareas y las inicia ambas casi al mismo tiempo, ¿no deberíamos tener 2 subprocesos, es decir, un ScheduledExecutorService con un tamaño de grupo central de 2?
Aunque funciona bien. Solo quiero entender por qué funciona bien con un solo hilo.
Respuestas
Para cualquier grupo de subprocesos (incluido ScheduledThreadPool), el número de subprocesos puede ser menor que el número de tareas. Los grupos de subprocesos tienen internamente una cola de tareas, en la que una tarea tendrá que esperar si no hay ningún subproceso disponible para ejecutar la tarea.
En su ejemplo, en t = 100 segundos, es necesario ejecutar dos tareas. Como solo hay un hilo disponible, ejecuta la primera tarea (mientras que la segunda espera en la cola). Una vez que se completa la primera tarea, el subproceso elige la segunda tarea de la cola y la completa.
Puede imprimir la identificación del hilo en ambas tareas y puede verificar que efectivamente estén siendo procesadas por el mismo hilo.
Editar: Básicamente, la tarea programada en un intervalo fijo se ejecuta varias veces con intervalos fijos intermedios. Durante estos intervalos, nuestro único hilo en el grupo está inactivo y puede elegir otras tareas para su ejecución. Así es como un solo hilo ejecuta ambas tareas.