Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia Ultima revisió Ambdós costats nova versio | ||
futurs_java [2022/11/23 16:34] albert_palacios_jimenez [Futurs, aturar un futur amb .cancel()] |
futurs_java [2022/12/16 10:39] albert_palacios_jimenez |
||
---|---|---|---|
Línia 1: | Línia 1: | ||
- | |||
====== Futurs a Java ====== | ====== Futurs a Java ====== | ||
Línia 7: | Línia 6: | ||
---- | ---- | ||
+ | ==== Exemples ==== | ||
+ | |||
+ | {{ :: | ||
==== Futurs ==== | ==== Futurs ==== | ||
Línia 237: | 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 392: | Línia 395: | ||
</ | </ | ||
+ | |||
+ | ==== 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 " | ||
+ | |||
+ | <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< | ||
+ | for (int cnt = 0; cnt < 5; cnt++){ | ||
+ | futureList.add(CompletableFuture.runAsync((getRunnable(cnt)))); | ||
+ | } | ||
+ | |||
+ | // Execucio dels futurs | ||
+ | System.out.println(" | ||
+ | futureList.forEach(CompletableFuture:: | ||
+ | |||
+ | // Mostrar resultats | ||
+ | System.out.println(" | ||
+ | System.out.println(" | ||
+ | System.out.println(" | ||
+ | } | ||
+ | |||
+ | //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(); | ||
+ | } | ||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ |