Lecture overview -- Keyboard shortcut: 'u'  Previous page: Synkronisering: For lidt og for meget -- Keyboard shortcut: 'p'  Next page: Wait og notify -- Keyboard shortcut: 'n'  Lecture notes - all slides and notes together  slide -- Keyboard shortcut: 't'  Help page about these notes  Alphabetic index  Course home  Page 35 : 41
Forelæsningsnoter i Objekt-orienteret Programmering
Samtidighed i Java
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

Der opstår ofte et behov for at synkronisere to tråde endnu mere end blot ved 'gensidig udelukkelse' på fælles objekter

Et sådant behov opstår hvis to tråde skal samarbejde om udførelse af en opgave

'Producent Forbruger' er et klassisk eksempel på et samarbejde mellem to processer.

Producenten fremstiller objekter, som sendes til forbrugeren.

Forbrugeren modtager objekter, og benytter dem til et bestemt formål

/user/normark/courses/prog1/prog1-01/sources/java/noteEksempler/producer-consumer-1/ProducerConsumerTest.javaProducent klassen.

Producent klassen. Denne klasse laver objekter (her blot tal) som skal afleveres til forbruger objektet. Når denne anstrengelse er overstået er der behov for at hvile ud - samle kræfter - så næste ting kan produceres (sleep).

/user/normark/courses/prog1/prog1-01/sources/java/noteEksempler/producer-consumer-1/ProducerConsumerTest.javaConsumer klassen.

Consumer klassen. Denne klasse forbruger de objekter, der modtages fra producent klassen. Forbruget består her i blot at udskrive objekterne (tal)

/user/normark/courses/prog1/prog1-01/sources/java/noteEksempler/producer-consumer-2/ProducerConsumerTest.javaEn simpel udgave af cubbyhole klassen, som ikke virker.

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.

/user/normark/courses/prog1/prog1-01/sources/java/noteEksempler/producer-consumer-1/ProducerConsumerTest.javaKlasse med en statisk main metode, der laver CubbyHole, og igangsætter Producer og Consumer.

Klasse med en statisk main metode, der laver CubbyHole, og igangsætter Producer og Consumer.

/user/normark/courses/prog1/prog1-01/sources/java/noteEksempler/producer-consumer-2/WrongProducerConsumerOutputOutput fra kørsel af programmet ovenfor, som illustrerer problemet.

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.

/user/normark/courses/prog1/prog1-01/sources/java/noteEksempler/producer-consumer-1/ProducerConsumerTest.javaEn forbedret CubbyHole klassen.

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).

/user/normark/courses/prog1/prog1-01/sources/java/noteEksempler/producer-consumer-1/ProducerConsumerOutputOutput fra kørsel af programmet ovenfor.

Output fra kørsel af programmet ovenfor.

Klasserne vist ovenfor stammer direkte fra et eksempel i The Java Tutorial, jf hosstående henvisning