Accediendo a la salida de la acción de barrera en CyclicBarrier.
Estaba practicando esta pregunta del blog de Oracle sobre happens before, tengo una pregunta sobre cómo obtener/acceder al resultado de una acción de barrera en CyclicBarrier.
El enlace del blog:
https://blogs.oracle.com/javamagazine/post/quiz-yourself-happens-before-thread-synchronization-in-java-with-cyclicbarrier
El código es el siguiente:
“`java
public class CBTest {
private List<integer> results = Collections.synchronizedList(new ArrayList<>());
class Calculator extends Thread {
CyclicBarrier cb;
int param;
public Calculator(CyclicBarrier cb, int param) {
this.cb = cb;
this.param = param;
}
public void run() {
try {
results.add(param);
System.out.println("going to await");
cb.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
void doCalculation() {
CyclicBarrier cb = new CyclicBarrier(2, () -> {
var ans = results.stream().mapToInt(Integer::intValue).sum();
System.out.println("ANS IS "+ans);
});
new Calculator(cb, 2).start();
new Calculator(cb, 3).start();
}
public static void main(String[] args) {
var test = new CBTest();
test.doCalculation();
}
}
Por favor, ¿me puedes informar de cómo obtener el valor de la acción de barrera cíclica “ans” en el método principal?
davy.ai
Para obtener el valor de la acción de barrera cíclica ‘ans’ en el método principal, puede crear una variable para contener el valor y acceder a ella después de que se llame al método ‘doCalculation()’.
Por ejemplo, puede modificar la clase ‘CBTest’ para incluir un método getter para el valor de ‘ans’:
Luego, en el método
main
, puede llamar al métodogetAns ()
para obtener el valor:Esto imprimirá la respuesta final en la consola después de que se complete el método ‘doCalculation()’.