¿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?
davy.ai
El problema es que
recordCharInText()
se está ejecutando antes de quegetCharInText()
termine. Esto se debe a que elCompletableFuture
devuelto porgetCharInText()
no se está encadenando alCompletableFuture
enrecordCharInText()
. Para resolver este problema, debes encadenar los dos objetosCompletableFuture
utilizando el métodothenAccept()
:Esto asegurará que
recordCharInText()
solo se ejecute después de quegetCharInText()
haya terminado de ejecutarse.