|
|
Eksempel på et program med synkronisering: Producent og Forbruger | Producent Forbruger eksemplet er klassisk hvad angår illustrationen af to tråde eller processer, som skal samarbejde på en synkroniseret måde. Eksemplet er også meget relevant i den praktiske verden |
|
|
| Consumer klassen.
Denne klasse forbruger de objekter, der modtages fra producent klassen. Forbruget består her i blot at udskrive objekterne (tal)
|
| En simpel udgave af cubbyhole klassen, som ikke virker.
Denne udgave er simplificeret helt ind til benet.
Vi medtager alene denne simple udgave af postkassen for at motivere os selv til at
lave en, som faktisk virker.
|
| Klasse med en statisk main metode, der laver CubbyHole, og igangsætter Producer og Consumer.
|
| Output fra kørsel af programmet ovenfor, som illustrerer problemet.
Vi ser at tallet 0 bliver produceret og forbrugt korrekt.
Men 2 bliver produceret for hurtigt, og således at 1 aldrig bliver
forbrugt. Det samme gør sig gældende for 3, osv.
|
| En forbedret CubbyHole klassen.
Der kan i dette eksempel kun opbevares ét objekt i postkassen.
Det er vigtigt at forstå, at vi ikke kender til rækkefølgen af kald til put og get.
Hvis put kaldes først (af producenten) skal vi sikre os, at vi ikke overskriver et allerede eksisterende objekt (contents).
Den boolske variable available er falsk hvis der er plads til et objekt i Cubbyhole.
Hvis get kaldes først (af forbrugeren) bliver vi nødt til at vente på at forbrugeren skal putte noget i postkassen.
While løkken i get kan forstås som 'afvent at der noget i postboksen' (altså available er true).
While løkken i put kan forstås som 'afvent at postboksen er tom' (altså available er false).
Bemærk brugen af while (idiomatisk anvendelse, jf. efterfølgende slide).
|
| Output fra kørsel af programmet ovenfor.
|
Klasserne vist ovenfor stammer direkte fra et eksempel i The Java Tutorial, jf hosstående henvisning |