background image

 

Przetwarzanie współbieżne 

Wojciech Kupczyk 

94415 

Laboratorium 5

 

Data 

3.04.2014, 14:30 

 

 

Cele laboratorium: 

  synchronizacja wątków w Javie 

 

Ad. 1. 

Zadanie polegało na zaimplementowaniu symulacji pubu w Javie. Projekt składa się z 3 klas: 
Klient,  Pub,  Main.  Poniżej  przedstawiam  kody  źródłowe  zawarte  w  każdym  z  tych  plików, 
oraz fragment przykładowego wydruku.  

Pub.java: 

public

 

class

 Pub { 

 7  
 8     

int

 

ilKlientow

ilKufli

 9     

int

[] 

tabKufli

10  
11 

//konstruktor Pubu

 

12     

public

 Pub(

int

 ilKlientow, 

int

 ilKufli) { 

13         

this

.

ilKufli

 = ilKufli; 

14         

this

.

ilKlientow

 = ilKlientow; 

15         

tabKufli

 = 

new

 

int

[

this

.

ilKufli

]; 

16         

for

 (

int

 i = 0; i < 

this

.

ilKufli

; i++) { 

17             

tabKufli

[i] = 1;        

//puste kufle

 

18         } 
19     } 
20  
21     

// Zajecie wolnego kufla przez klienta, lub oczekiwanie na zwolnienie jednego z zajetych kufli.

 

22     

public

 

synchronized

 

void

 zabierzKufel(Klient klient) { 

23         System.

out

.println(klient.

idKlienta

 + 

" klient oczekuje na wolny kufel."

); 

24         

while

 (

true

) { 

25             

try

 { 

26                 

for

 (

int

 i = 0; i < 

ilKufli

; i++) 

//petla po wszystkich kuflach

 

27                 { 
28                     

//jesli dany kufel jest wolny to zabieramy

 

29                     

if

 (

tabKufli

[i] == 1) { 

30                         

tabKufli

[i] = 0; 

31                         klient.

idZajetegoKufla

 = i; 

32                         

break

33                     } 
34                 } 
35                 

if

 (klient.

idZajetegoKufla

 == -1) { 

36                     wait();  

// jesli nie znaleziono zadnego wolnego kufla to czekamy

 

37                 } 

else

 { 

38                     

break

39                 } 
40             } 

catch

 (InterruptedException ex) { 

41                 Logger.getLogger(Pub.

class

.getName()).log(Level.

SEVERE

null

, ex); 

42                 System.

out

.println(

"Wyjatek w metodzie zabierzKufel !!! "

); 

43             } 
44         } 
45         System.

out

.println(klient.

idKlienta

 + 

" klient dostal kufel "

 + (klient.

idZajetegoKufla

 + 1)); 

46     } 
47  
48 

//nalewanie piwa, klient jako argument

 

49     

public

 

synchronized

 

void

 nalewanie(Klient klient) { 

50         

try

 { 

background image

51             System.

out

.println(klient.

idKlienta

 + 

" klient nalewa piwo do kufla "

 + (klient.

idZajetegoKufla

 + 1)); 

52             Thread.sleep(5000); 
53             System.

out

.println(klient.

idKlienta

 + 

" klient nalal piwo do kufla "

 + (klient.

idZajetegoKufla

 + 1)); 

54         } 

catch

 (InterruptedException ie) { 

55             System.

out

.println(

"Wyjatek w metodzie nalewanie !!!"

); 

56         } 
57     } 
58  
59     

// oddawanie zajetego kufla

 

60     

public

 

synchronized

 

void

 oddawanie(Klient klient) { 

61         System.

out

.println(klient.

idKlienta

 + 

" klient zwalnia kufel nr "

 + (klient.

idZajetegoKufla

 + 1)); 

62         

tabKufli

[klient.

idZajetegoKufla

] = 1;       

//oddanie kufla

 

63         klient.

idZajetegoKufla

 = -1; 

64         notifyAll();            

//budzenie oczekujacych klientow

 

65     } 
66  
67 } 

  

Klient.java: 

 2 

// klasa Klient

 

 3 

class

 Klient 

extends

 Thread { 

 4  
 5     Pub 

pub

 6     

int

 

idKlienta

 7     

int

 

idZajetegoKufla

 8  
 9     

// konstruktor klienta

 

10     

public

 Klient(

int

 nr, Pub pub) { 

11         

this

.

idKlienta

 = nr; 

12         

this

.

pub

 = pub; 

13         

idZajetegoKufla

 = -1; 

// domyslnie klient nie posiada kufla

 

14     } 
15  
16     

public

 

void

 run() { 

17         

//klient pije 2 piwa

 

18         

for

 (

int

 i = 1; i <= 2; i++) { 

19             

pub

.zabierzKufel(

this

); 

20             

pub

.nalewanie(

this

); 

21             System.

out

.println(

idKlienta

 + 

" klient pije piwo w kuflu "

 + (

idZajetegoKufla

 + 1)); 

// picie 

piwa

 

22             

pub

.oddawanie(

this

); 

23         } 
24     } 
25 } 
 

 
Main.java: 

package

 pub; 

 2  
 3 

public

 

class

 Main { 

 4  
 5     

public

 

static

 

void

 main(String[] args) { 

 6         

int

 ilKufli = 3; 

 7         

int

 ilKlientow = 5; 

 8  
 9         Pub pub = 

new

 Pub(ilKlientow, ilKufli); 

10         Klient[] klienci = 

new

 Klient[ilKlientow]; 

11         

//utworzenie watkow

 

12         

for

 (

int

 k = 0; k < ilKlientow; k++) { 

13             klienci[k] = 

new

 Klient(k + 1, pub); 

14         } 
15         

//start watkow

 

16         

for

 (

int

 j = 0; j < ilKlientow; j++) { 

17             klienci[j].start(); 
18         } 
19     } 
20 } 
21

 

 

background image