bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


futurs_java

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
futurs_java [2022/11/23 16:45]
albert_palacios_jimenez
futurs_java [2022/12/16 10:43] (actual)
albert_palacios_jimenez
Línia 239: Línia 239:
  
 **.runAsync** quan no tenen valor de retorn **.runAsync** quan no tenen valor de retorn
 +
 **.supplyAsync** quan tenen valor de retorn **.supplyAsync** quan tenen valor de retorn
  
Línia 394: Línia 395:
  
 </code> </code>
 +
 +==== CompletableFuture i dades compartides ====
 +
 +Cada futur en realitat és un thread que es pot executar en paral·lel a altres futurs.
 +
 +Si aquests futurs accedeixen a les mateixes dades, s’ha de tenir algun mètode de bloqueig, per tal que els altres threads no modifiquin les dades simultàniament i per tant aquestes siguin errònies.
 +
 +Aquest bloqueig es pot aconseguir amb "ReentrantLock", tal i com mostra el següent exemple.
 +
 +En aquest codi es veu com les dades sense bloqueig només poden comptar fins a 10 perquè els fils es trepitgen entre ells, però les que implementen el bloqueig aconsegueixen comptar fins a 50.
 +
 +<code java>
 +import java.util.ArrayList;
 +import java.util.concurrent.CompletableFuture;
 +import java.util.concurrent.locks.ReentrantLock;
 +
 +public class FutMain {
 +
 +    // Vector de dades
 +    private static int dadesSns = 0;
 +    private static int dadesBqg = 0;
 +
 +    // Bloquejador de recursos
 +    private static ReentrantLock mutex = new ReentrantLock();
 +
 +    // Main
 +    public static void main(String[] args) {
 +        
 +        // Creacio de futurs
 +        ArrayList<CompletableFuture<Void>> futureList = new ArrayList<>();
 +        for (int cnt = 0; cnt < 5; cnt++){
 +            futureList.add(CompletableFuture.runAsync((getRunnable(cnt))));
 +        }
 +
 +        // Execucio dels futurs
 +        System.out.println("Esperant resultats");
 +        futureList.forEach(CompletableFuture::join); 
 +
 +        // Mostrar resultats
 +        System.out.println("Resultats:");
 +        System.out.println("Dades sense bloqueig: " + dadesSns);
 +        System.out.println("Dades amb bloqueig: " + dadesBqg);
 +    }
 +
 +    //Codi executat pels futurs
 +    static Runnable getRunnable (int pos) {
 +        return new Runnable () {
 +            @Override public void run () {
 +
 +                // Modificar les dades sense bloqueig
 +                for (int cnt = 0; cnt < 10; cnt++) {
 +                    int val = dadesSns;
 +                    try {Thread.sleep(10);
 +                    catch (InterruptedException e) {e.printStackTrace();}
 +                    dadesSns = val + 1;
 +                }
 +
 +                try {
 +                    // Bloquejem els recursos per assegurar la seva exclusivitat
 +                    mutex.lock();
 +
 +                    // Modificar les dades amb bloqueig 
 +                    for (int cnt = 0; cnt < 10; cnt++) {
 +                        int val = dadesBqg;
 +                        try {Thread.sleep(10);
 +                        catch (InterruptedException e) {e.printStackTrace();}
 +                        dadesBqg = val + 1;
 +                    }
 +
 +                } finally {
 +                    mutex.unlock();
 +                }
 +            }
 +        };
 +    }
 +}
 +</code>
 +
 +
futurs_java.1669221909.txt.gz · Darrera modificació: 2022/11/23 16:45 per albert_palacios_jimenez