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.

¿Por qué CompletableFuture no ejecuta la tarea con runAsync?

Quiero hacer un programa de prueba con CompletableFuture. Tengo una clase con 2 funciones:

public class FutureTextData {
    private ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();
    private  CompletableFuture<Void> futureForText;

<pre><code>public void getCharInText(String texto){
    futureForText = CompletableFuture.runAsync(() -> {
        for (int i = 0; i < texto.length()-3; i++) {
            map.compute(texto.substring(i+1),(clave,valor) -> valor+=1);
            map.compute(texto.substring(i+2),(clave,valor) -> valor+=1);
            map.compute(texto.substring(i+3),(clave,valor) -> valor+=1);
        }
        for(Map.Entry<String ,Integer> entry:map.entrySet()){
            if(entry.getKey().length()==3)
                System.out.println(entry.getKey());

        }

    });
}

public void recordCharInText(String archivoSalida){
    /*try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }*/
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
        File archivo = new File(archivoSalida);

        try(BufferedWriter bf = new BufferedWriter(archivoSalida(new FileWriter(archivo))){
            for(Map.Entry<String ,Integer> entry:map.entrySet()){
                bf.write(entry.getKey() +"<----->" + entry.getValue());

            }

        }catch (IOException e) {
            e.printStackTrace();
        }
    });
}
</code></pre>

<p>}

En getCharInText(), quiero contar el número de ciertas subcadenas en el texto, y en recordCharInText() quiero guardar el estado actual del mapa.

Y cuando ejecuto el programa:

FutureTextData futureTextData = new FutureTextData();
futureTextData.getCharInText(result);
futureTextData.recordCharInText("outFile.txt");

Entonces todo se completa sin errores y todo. Es decir, el mapa no se escribe en el archivo y getCharInText() ni siquiera se ejecuta.

¿Puede decirme cuál es el error?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema es que recordCharInText() se está ejecutando antes de que getCharInText() termine. Esto se debe a que el CompletableFuture devuelto por getCharInText() no se está encadenando al CompletableFuture en recordCharInText(). Para resolver este problema, debes encadenar los dos objetos CompletableFuture utilizando el método thenAccept():

    FutureTextData futureTextData = new FutureTextData();
    futureTextData.getCharInText(result)
            .thenAccept((Void) -> futureTextData.recordCharInText("outFile.txt"));
    

    Esto asegurará que recordCharInText() solo se ejecute después de que getCharInText() haya terminado de ejecutarse.

Comments are closed.