Sunteți pe pagina 1din 6

UNIVERSITATEA TEHNICĂ A MOLDOVEI

FACULTATEA CALCULATOARE, INFORMATICĂ ȘI


MICROELECTRONICĂ
DEPARTAMENTUL INFORMATICĂ ȘI INGINERIA
SISTEMELOR

Raport
LUCRARE DE LABORATOR NR. 1
la Arhitectura Sistemelor de Operare
Tema: Implimentarea metodelor de sincronizare a proceselor.

A realizat: st. gr. C-161 Crucean Cristian


A verificat: lector superior Rotaru Lilia
Chișinău 2019
Tema: Implimentarea metodelor de sincronizare a proceselor.

Scopul lucrării: Însuşirea metodelor de sincronizare a thread-urilor

Sarcina:

3 producători generează aleatoriu consoane care sunt consumate de 2 consumatori. De afişat


informaţia despre producerea şi consumarea obiectelor, mesajele despre cazurile când
“depozitul e gol sau plin”. Toate operaţiile se efectuează până când fiecare consumator este
îndestulat cu 12 obiecte.

Dimensiunea depozitului este 11.

Main.java

public class Main {


public static void main(String[] args) {
Depozit depozit = new Depozit();
Producator p1 = new Producator(depozit, "Producator.1");
Producator p2 = new Producator(depozit, "Producator.2");
Producator p3 = new Producator(depozit, "Producator.3");
Consumator c1 = new Consumator(depozit, "Consumator_1");
Consumator c2 = new Consumator(depozit, "Consumator_2");

p1.start(); p2.start(); p3.start();


c1.start(); c2.start();
while(true){
if(!c1.isAlive() || !c2.isAlive() ){
p1.stop(); p2.stop(); p3.stop();
break;
}
}
}
}

Consumator.java

public class Consumator extends Thread {


private Depozit depozit;
private String nume;

Consumator(Depozit depozit, String nume){


this.depozit = depozit;
this.nume = nume;
}
public synchronized void run(){
int nr = 12,temp;

for(int i=0; i < nr; i++){


temp = depozit.get(nume);
if(i == nr-1){
System.out.println("\t"+nume+" a consumat "+nr+" elemente");
}
try{
sleep((int)(Math.random()*1000));
}catch(InterruptedException e){}
}
}
}

Producator.java

public class Producator extends Thread {


private Depozit depozit;
private String nume;
private char[] tab = new char[]
{'B','C','D','F','H','T','R','S','W','M','N'};

Producator(Depozit depozit, String nume){


this.depozit = depozit;
this.nume = nume;
}

public synchronized void run(){


int index1, index2;

while(true){
index1 = (int)(Math.random()*10);
depozit.put(tab[index1], nume);
try{
sleep((int)(Math.random()*1000));
}catch(InterruptedException e){}
}
}
}

Depozit.java

public class Depozit {

char[] dep = new char[15];


int c = 0;
boolean liber = false;
boolean gol = true;
String indicator = "Consumator_2";
int ind = 0;

public synchronized int get(String nume) {


while (!liber) {
try {
wait();
} catch (InterruptedException e) {
}
}
if(indicator != nume ){
indicator = nume;
if (c == 0) {
liber = false; gol = true;
System.out.println(">>> Depozitul este gol <<<");
}
if (c < 12) {
gol = true; liber = true;
System.out.println("\t" + nume + " a consumat " + dep[c]);
c--;
}
}
else indicator = nume;
notifyAll();
return dep[c + 1];
}
public synchronized void put(char n1, String nume){
while(!gol) {
try {
wait();
} catch (InterruptedException e) { }
}

if(c == 10){
afisare(n1, nume);
gol = false; liber = true;
System.out.println("!!! Depozitul este plin !!!");
}
else
if(c < 10){
afisare(n1, nume);
gol = true;
}

notifyAll();

private void afisare(char n1, String nume) {


c++;
dep[c] = n1;
System.out.println(""+nume+" a produs "+n1);
}

Rezultat:

Producator.1 a produs W

Producator.2 a produs B

Producator.3 a produs S

Producator.3 a produs C

Producator.2 a produs C

Producator.3 a produs H

Producator.1 a produs T

Producator.2 a produs S

Producator.3 a produs M

Producator.1 a produs B

Producator.1 a produs B

!!! Depozitul este plin !!!


Consumator_1 a consumat B

Producator.3 a produs F

!!! Depozitul este plin !!!

Consumator_2 a consumat F

Producator.2 a produs S

!!! Depozitul este plin !!!

Consumator_1 a consumat S

Producator.3 a produs C

!!! Depozitul este plin !!!

Consumator_2 a consumat C

Producator.1 a produs C

!!! Depozitul este plin !!!

Consumator_1 a consumat C

Producator.2 a produs S

!!! Depozitul este plin !!!

Consumator_2 a consumat S

Producator.3 a produs H

!!! Depozitul este plin !!!

Consumator_1 a consumat H

Producator.3 a produs F

!!! Depozitul este plin !!!

Consumator_2 a consumat F

Producator.2 a produs B

!!! Depozitul este plin !!!

Consumator_1 a consumat B

Producator.1 a produs C

!!! Depozitul este plin !!!

Consumator_2 a consumat C

Producator.2 a produs S
!!! Depozitul este plin !!!

Consumator_1 a consumat S

Producator.3 a produs M

!!! Depozitul este plin !!!

Consumator_2 a consumat M

Producator.2 a produs R

!!! Depozitul este plin !!!

Consumator_1 a consumat R

Producator.1 a produs S

!!! Depozitul este plin !!!

Consumator_2 a consumat S

Producator.3 a produs B

!!! Depozitul este plin !!!

Consumator_2 a consumat 12 elemente

Consumator_1 a consumat B

Consumator_1 a consumat 12 elemente

Producator.2 a produs B

!!! Depozitul este plin !!!