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.

Cómo finalizar una tarea (timeout un hilo) (levantando interrupción) utilizando executor.execute y future.get() sin bloquear el hilo principal.

Intenté usar “future” dentro del servicio executor, funciona sin bloquear el hilo principal. Sin embargo, esto termina creando el doble de cantidad de hilos, lo cual no es deseable. En el siguiente código pude usar “future.get()” sin bloquear, pero tuve que crear el doble de cantidad de hilos.

 for (int i: array) {
                    executor.execute(() -> {
                        Future f = new FutureTask(() -> {
                            Goring goring = new Goring();

                            goring.goring(i);

                        },null);
                        Thread thread = new Thread((Runnable)f);
                        thread.start();

                        try {
                            f.get(1, TimeUnit.NANOSECONDS);
                        } catch (InterruptedException | ExecutionException | TimeoutException | RuntimeException e) {
                            // TODO Auto-generated catch block
                            // System.out.println(e.getMessage());
                            e.printStackTrace();
                            f.cancel(true);
                        }

                    });
                }

                executor.shutdown();

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en informática especializado en Java, multithreading, timeout, future y executor service, entiendo que el uso de future dentro de executor service se puede hacer sin bloquear el hilo principal. Sin embargo, puede terminar creando el doble de hilos, lo cual hace que sea menos deseable.

    Al revisar el fragmento de código proporcionado, observé que el bucle for se ejecuta usando el executor service. Dentro del bucle, se crea una tarea future y se envía a un nuevo hilo, que luego comienza la tarea. Se utiliza el método get() de future con un tiempo de espera de 1 nanosegundo, lo que permite que el hilo principal siga adelante sin esperar a que se complete la tarea.

    Para abordar el problema de crear hilos dobles, un enfoque mejor es crear y enviar una tarea callable en lugar de una tarea future. La tarea callable devuelve el resultado del cálculo como un future, eliminando la necesidad de crear un nuevo hilo para cada tarea. Luego, el future se envía al executor service utilizando el método apropiado, lo que permite que el hilo principal obtenga el resultado sin bloquearse.

    En general, el uso de tareas callable y executor service proporciona una solución más eficiente y escalable para la programación concurrente en Java.

Comments are closed.