


Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Spiegazione sulla programmazione concorrente
Tipologia: Dispense
1 / 4
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!



La programmazione java permette la comunicazione tra thread. Un thread può comunicare agli altri thread che un evento si è verificato e rendere in questo modo efficiente la sincronizzazione tra i thread (si può così evitare l'inefficiente utilizzo del polling , ovvero la continua interrogazione dello stato di una variabile per capire se un evento si è verificato, cosa che impegna la CPU a vuoto finchè non si verifica l'evento). La comunicazione tra thread in java si basa su 3 metodi:
Le classi saranno quindi del tipo: Buffer unDato metti ( ) prendi ( ) Produttore buffer Produttore run Consumatore buffer Consumatore run Principale
main Scriviamo adesso le classi: class Buffer { int unDato; boolean datoNelBuffer = false; synchronized void metti (int dato) { if (datoNelBuffer) wait ( ); unDato=dato; datoNelBuffer=true; System.out.println (“Scritto: “ + dato); notify ( ); } synchronized int prendi ( ) { if (! datoNelBuffer) wait(); System.out.println (“\t\t letto: “ + unDato); datoNelBuffer=false; notify( ); return unDato; } } class Produttore implements Runnable { Buffer buffer;
wait ( ); } catch (Exception e) { }; System.out.println (“\t\t letto: “ + unDato); datoNelBuffer=false; notify( ); return unDato; } } Il programma corretamente stampa (a sinistra la colonna di stampe del metodo metti ( ), a destra la colonna delle stampe del metodo prendi ( )): Scritto: 45 letto: 45 Scritto: 46 letto: 46 Scritto: 47 letto: 47 Scritto: 48 letto: 48 Scritto: 49 letto: 49 Scritto: 50 letto: 50 Scritto: 51 letto: 51 Scritto: 52 letto: 52 Scritto: 53 letto: 53 Scritto: 54 letto: 54 Quindi, per implementare una sincronizzazione tra thread: