0% au considerat acest document util (0 voturi)
152 vizualizări6 pagini

Java - Lab4 Cina Filozofilor

Acest document prezintă o lucrare de laborator care abordează problema filozofilor care mănâncă la masă. Lucrarea prezintă implementarea algoritmului cina filosofilor prin crearea de fire de execuție și sincronizarea acestora. Rezultatele obținute demonstrează că studentul a însușit cu succes tema și poate aplica cunoștințele acumulate.

Încărcat de

Octavian Macovetchi
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
152 vizualizări6 pagini

Java - Lab4 Cina Filozofilor

Acest document prezintă o lucrare de laborator care abordează problema filozofilor care mănâncă la masă. Lucrarea prezintă implementarea algoritmului cina filosofilor prin crearea de fire de execuție și sincronizarea acestora. Rezultatele obținute demonstrează că studentul a însușit cu succes tema și poate aplica cunoștințele acumulate.

Încărcat de

Octavian Macovetchi
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 6

Ministerul Educaţiei, Tineretului şi Sportului al Republicii Moldova

Universitate Tehnică a Moldovei

Disciplina: „ Programarea Concurenta”

Lucrarea de laborator Nr.4

Tema: Cina filozofilor

A realizat: ………………….. …………..

st. gr. C-…

A verificat: Rotaru Lilia


Chişinău 2012

Scopul lucrarii:
 Însuşirea modalităţilor de sincronizare pentru algoritmul cina filosofilor;
 Realizarea sincronizării firelor de execuţie pentru algoritmul cina filosofilor;
Etapele de realizare:
 Sincronizarea firelor de execuţie pentru algoritmul cina filosofilor;

 Realizarea metodelor de sincronizare a firelor de execuţie pentru algoritmul cina


filosofilor;
 Crearea interfeţii programului;
 Prezentarea lucrării.
Sarcina: Scriţi un program pentru 12 cititori şi 18scriitori, care înscriu în bază cîte 7
obiecte.

Listingul Programului:
package filozofi;

import java.util.concurrent.locks.*;

import java.util.logging.Level;

import java.util.logging.Logger;

class Philosopher extends Thread {

public int Gindeste_contor=0;

private int name;

private state currentState;

private enum state { înfometat, Maninca, mediteaza };

private Forks forks;

private boolean wasHungry = false;

private static int currentName = 0;

public Philosopher(Forks forks) {

this.forks = forks;

this.currentState = state.înfometat;

this.name = currentName++;

System.out.println("Filosoful #"+name+" s-a așezat la masa...");

2
@Override

public void run() {

while (true) {

switch (currentState) {

case înfometat:

if (wasHungry == false) {

System.out.println("Filosoful #"+name+" a înfometat");

wasHungry = true;

if (forks.takeForks(name) == true) {

this.currentState = state.Maninca;

break;

case Maninca:

System.out.println("Filosoful #"+name+" maninca");

try {

Thread.sleep( (int)(Math.random()*1000) );

} catch (InterruptedException ex) {

Logger.getLogger(Philosopher.class.getName()).log(Level.SEVERE, null, ex);

//countEating++;

forks.leaveForks(name);

this.currentState = state.mediteaza;

wasHungry = false;

break;

case mediteaza:

System.out.println("Filosoful #"+name+" mediteaza");

try {

Thread.sleep( (int)(Math.random()*2000) );
3
} catch (InterruptedException ex) {

Logger.getLogger(Philosopher.class.getName()).log(Level.SEVERE, null, ex); }

this.currentState = state.înfometat;

wasHungry = false;

Gindeste_contor++;

if( Gindeste_contor==4) {

System.out.println("\n--->Filosoful #"+name+" a meditat de trei ori");

this.stop(); }

break; } }}}

class Forks {

public Forks(int number) {

this.number = number;

this.forks = new state[number];

for (int i = 0; i < number; i++)

forks[i] = state.Liber;

System.out.println("Bețișoarele sunt gata");

printState(); }

public boolean takeForks (int position) {

boolean success = false;

lock.lock();

state leftState;

state rightState;

if (position == 0) leftState = forks[number-1];

else leftState = forks[position-1];

rightState = forks[position];

if (leftState == state.Liber && rightState == state.Liber) {

if (position == 0) forks[number-1] = state.Ocupat;

else forks[position-1] = state.Ocupat;

forks[position] = state.Ocupat;
4
System.out.println("Filosoful #"+position+" a luat bețișoarele");

printState();

success = true; }

lock.unlock();

return success; }

public void leaveForks (int position) {

lock.lock();

state leftState;

state rightState;

if (position == 0) forks[number-1] = state.Liber;

else forks[position-1] = state.Liber;

forks[position] = state.Liber;

System.out.println("Filosoful #"+position+" a lasat bețișoarele");

printState();

lock.unlock(); }

private void printState() {

System.out.print("Starea curenta: ");

for (int i = 0; i<number; i++)

System.out.print(i+":"+forks[i]+" ");

System.out.println(); }

private int number;

private state forks[];

private enum state { Liber, Ocupat};

private Lock lock = new ReentrantLock();}

public class Filozofi {

public Filozofi(){}

public static void main(String[] args) {

Forks forks = new Forks(10);

Philosopher[] philosophers = new Philosopher[10];


5
for (int i = 0; i<10; i++)

philosophers[i] = new Philosopher(forks);

for (int i = 0; i<10; i++)

philosophers[i].start();

}}

Rezultatele obtinute:

Concluzie: In urma efectuarii acestei lucrari de laborator am acumulat cunostinte noi in


domeniul programarii cum ar fi cum ar fi crearea thread-urilor si crearea unui grup de
thread-uri. Elaborind aceasta lucrare am demonstrat ca am insusit cu succes tema data si
putem sa aplicam pe viitor cunostintele acumulate. Desi la inceput parea o lucrare grea sa
dovedit a fi o lucrere simpla datorita cursului pe care l-am studiat.

S-ar putea să vă placă și