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.

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?

Tags:  , , ,

Answer

  1. Avatar for 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’:

    public class CBTest {
    
        private List<integer> results = Collections.synchronizedList(new ArrayList<>());
        private int ans;
    
        ...
    
        void doCalculation() {
            CyclicBarrier cb = new CyclicBarrier(2, () -> {
                ans = results.stream().mapToInt(v -> v.intValue()).sum();
                System.out.println("ANS IS "+ans);
            });
            new Calculator(cb, 2).start();
            new Calculator(cb, 3).start();
        }
    
        int getAns() {
            return ans;
        }
    
        ...
    }
    

    Luego, en el método main, puede llamar al método getAns () para obtener el valor:

    public static void main(String[] args) {
        var test = new CBTest();
        test.doCalculation();
        int ans = test.getAns();
        System.out.println("FINAL ANSWER IS "+ans);
    }
    

    Esto imprimirá la respuesta final en la consola después de que se complete el método ‘doCalculation()’.

Comments are closed.