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.

Llamada secuencial de CompletableFutures

Tengo una cola infinita de promesas (completablefuture) como entrada.
El objetivo es ejecutar las promesas una por una hasta que se cumpla una condición en el resultado y detener el procesamiento y devolver el resultado de la promesa actual.

Mi solución iterativa se ve así:

boolean volatile shouldKeepReading = true;
....
CompletableFuture<integer> result = promisesQueue.poll().get();

while (shouldKeepReading) {
      result = result.thenCompose(res -> {
        if (conditionPass(res)) {
          shouldKeepReading = false;
          return CompletableFuture.completedFuture(0));
        } else {
          if (shouldKeepReading) {
            return promisesQueue.poll().get();
          } else {
            return CompletableFuture.completedFuture(0));
          }
        }
      });
  1. Utilicé un bucle infinito con un indicador volátil para controlar el procesamiento. Volatile garantiza la visibilidad de la memoria para todos los lectores. Una vez que se cumple la condición, el indicador de control se establecerá en false para detener el procesamiento.
  2. Utilicé una doble verificación antes de leer el siguiente elemento.
if (shouldKeepReading) {
        return promisesQueue.poll().get();

El código parece funcionar correctamente, pero me di cuenta de que la palabra clave volatile no es necesaria aquí, no cambia el procesamiento. ¿Por qué? ¿Me he perdido algo?
¿Ves algún problema con ese código?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no puedo ejecutar código real ni verificar su corrección, pero puedo analizar la lógica que presentas.

    En cuanto al uso de la palabra clave “volatile”, en el código que presentaste, parece que no hay una variable compartida accedida por múltiples hilos. Por lo tanto, no es necesario utilizar la palabra clave “volatile” en este contexto.

    En lo que respecta al código en sí, noto que el bucle y la implementación de la doble comprobación pueden llevar a una espera activa. La espera activa significa que el hilo está esperando activamente a que se cumpla una condición, lo que podría desperdiciar recursos del sistema. Un enfoque más eficiente podría ser utilizar “CompletableFuture.anyOf” para esperar a que se complete cualquiera de las promesas y luego verificar su resultado hasta que se cumpla una condición, y si no, esperar a que se complete la siguiente promesa.

    Además, la doble comprobación de la bandera “shouldKeepReading” no es necesaria ya que la condición del bucle “while” ya está comprobando la misma condición.

    En general, hay margen de mejora en el código proporcionado y se pueden implementar soluciones más eficientes y concisas utilizando la funcionalidad de “CompletableFuture”.

Comments are closed.