Untitled
unknown
plain_text
a year ago
4.4 kB
6
Indexable
import java.util.Queue;
import java.util.LinkedList;
import java.util.Random;
class Depozit {
private final Queue<Character> buffer = new LinkedList<>();
private final int capacitate;
private boolean mesajDepozitGolAfișat = false;
public synchronized char[] preia(int obiecteRamase) throws InterruptedException {
while (buffer.size() < 2) {
if (obiecteRamase <= 0) {
return new char[0];
}
System.out.println("Depozitul este gol, consumatorul așteaptă...");
wait();
}
char[] obiecte = {buffer.poll(), buffer.poll()};
System.out.println("Consumatorul a preluat: [" + obiecte[0] + ", " + obiecte[1] + "]");
notifyAll();
return obiecte;
}
public Depozit(int capacitate) {
this.capacitate = capacitate;
}
public synchronized void pune(char[] obiecte) throws InterruptedException {
for (char obiect : obiecte) {
while (buffer.size() == capacitate) {
System.out.println("Depozitul este plin, producătorul așteaptă...");
wait();
}
buffer.add(obiect);
mesajDepozitGolAfișat = false;
System.out.println("Producătorul a adăugat: " + obiect);
notifyAll();
}
}
public synchronized char[] preia() throws InterruptedException {
while (buffer.size() < 2) {
if (!mesajDepozitGolAfișat) {
System.out.println("Depozitul este gol, consumatorul așteaptă...");
mesajDepozitGolAfișat = true;
}
wait();
}
char[] obiecte = {buffer.poll(), buffer.poll()};
System.out.println("Consumatorul a preluat: [" + obiecte[0] + ", " + obiecte[1] + "]");
notifyAll();
return obiecte;
}
}
class Producator extends Thread {
private final Depozit depozit;
private final Random random = new Random();
public Producator(Depozit depozit) {
this.depozit = depozit;
}
private char[] genereazaDouaConsoane() {
char[] consoane = "BCDFGHJKLMNPQRSTVWXYZ".toCharArray();
return new char[]{
consoane[random.nextInt(consoane.length)],
consoane[random.nextInt(consoane.length)]
};
}
@Override
public void run() {
try {
while (true) {
char[] obiecte = genereazaDouaConsoane();
depozit.pune(obiecte);
Thread.sleep(random.nextInt(100));
}
} catch (InterruptedException e) {
System.out.println("Producătorul a fost întrerupt.");
}
}
}
class Consumator extends Thread {
private final Depozit depozit;
private final int obiecteNecesare;
private int obiecteConsumate = 0;
public Consumator(Depozit depozit, int obiecteNecesare) {
this.depozit = depozit;
this.obiecteNecesare = obiecteNecesare;
}
@Override
public void run() {
try {
while (true) {
synchronized (depozit) {
if (obiecteConsumate >= obiecteNecesare) {
break;
}
}
char[] pereche = depozit.preia(obiecteNecesare - obiecteConsumate);
if (pereche.length == 0) {
break;
}
obiecteConsumate += pereche.length;
Thread.sleep(100);
}
System.out.println("Consumatorul a terminat. Obiecte consumate: " + (obiecteConsumate + 6));
} catch (InterruptedException e) {
System.out.println("Consumatorul a fost întrerupt.");
}
}
}
public class ProducatorConsumator {
public static void main(String[] args) {
int dimensiuneDepozit = 11;
int obiecteNecesareConsumatori = 6;
Depozit depozit = new Depozit(dimensiuneDepozit);
Producator p1 = new Producator(depozit);
Producator p2 = new Producator(depozit);
Producator p3 = new Producator(depozit);
Consumator c1 = new Consumator(depozit, obiecteNecesareConsumatori);
Consumator c2 = new Consumator(depozit, obiecteNecesareConsumatori);
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
}
}Editor is loading...
Leave a Comment