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 [Link].*;
import [Link];
import [Link];
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) {
[Link] = forks;
[Link] = state.înfometat;
[Link] = currentName++;
[Link]("Filosoful #"+name+" s-a așezat la masa...");
2
@Override
public void run() {
while (true) {
switch (currentState) {
case înfometat:
if (wasHungry == false) {
[Link]("Filosoful #"+name+" a înfometat");
wasHungry = true;
if ([Link](name) == true) {
[Link] = [Link];
break;
case Maninca:
[Link]("Filosoful #"+name+" maninca");
try {
[Link]( (int)([Link]()*1000) );
} catch (InterruptedException ex) {
[Link]([Link]()).log([Link], null, ex);
//countEating++;
[Link](name);
[Link] = [Link];
wasHungry = false;
break;
case mediteaza:
[Link]("Filosoful #"+name+" mediteaza");
try {
[Link]( (int)([Link]()*2000) );
3
} catch (InterruptedException ex) {
[Link]([Link]()).log([Link], null, ex); }
[Link] = state.înfometat;
wasHungry = false;
Gindeste_contor++;
if( Gindeste_contor==4) {
[Link]("\n--->Filosoful #"+name+" a meditat de trei ori");
[Link](); }
break; } }}}
class Forks {
public Forks(int number) {
[Link] = number;
[Link] = new state[number];
for (int i = 0; i < number; i++)
forks[i] = [Link];
[Link]("Bețișoarele sunt gata");
printState(); }
public boolean takeForks (int position) {
boolean success = false;
[Link]();
state leftState;
state rightState;
if (position == 0) leftState = forks[number-1];
else leftState = forks[position-1];
rightState = forks[position];
if (leftState == [Link] && rightState == [Link]) {
if (position == 0) forks[number-1] = [Link];
else forks[position-1] = [Link];
forks[position] = [Link];
4
[Link]("Filosoful #"+position+" a luat bețișoarele");
printState();
success = true; }
[Link]();
return success; }
public void leaveForks (int position) {
[Link]();
state leftState;
state rightState;
if (position == 0) forks[number-1] = [Link];
else forks[position-1] = [Link];
forks[position] = [Link];
[Link]("Filosoful #"+position+" a lasat bețișoarele");
printState();
[Link](); }
private void printState() {
[Link]("Starea curenta: ");
for (int i = 0; i<number; i++)
[Link](i+":"+forks[i]+" ");
[Link](); }
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.