es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuando se utiliza un grupo de hilos, al llamar a Future#get, el programa se cuelga.

Creé un grupo de hilos (thread pool) y presenté dos tareas. ¿Por qué mi aplicación se cuelga sin excepciones después de imprimir “tarea uno, resultado: null”?

   private final static ThreadPoolExecutor executorService = new
        ThreadPoolExecutor(1, 1, 1L, TimeUnit.MINUTES,
        new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.DiscardPolicy());

public static void main(String[] args) throws Exception {
    Future taskOne = executorService.submit(() -> {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    Future taskTwo = executorService.submit(() -> System.out.println("tarea dos está funcionando"));;
    System.out.println("tarea uno, resultado: " + taskOne.get());
    System.out.println("tarea dos, resultado: " + taskTwo.get());
    executorService.shutdown();
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que la aplicación se cuelga es que la primera tarea (taskOne) no devuelve ningún resultado, y la segunda tarea (taskTwo) está esperando a que se complete la primera antes de poder empezar a funcionar. Esto se debe a que la llamada a taskOne.get() es una llamada bloqueante que espera a que el resultado de la tarea esté disponible. Como la tarea no devuelve nada, la llamada a get() nunca se resuelve y la aplicación se cuelga.

    Para solucionar este problema, el código debería modificarse para devolver un resultado desde la primera tarea o hacer que sea un Runnable en lugar de un Callable. Si se modifica la tarea a un Runnable, se ejecutará de manera asíncrona y la segunda tarea no tendrá que esperar a que se complete antes de empezar. Alternativamente, si se necesita devolver un resultado desde la primera tarea, se debería modificar para devuelve un valor en lugar de ser un método void y la llamada a get() debería modificarse para aceptar ese resultado.

Comments are closed.