Witam ! Tworze program prezentujący problem producenta i konsumenta. Przy buforze na jedną literę działało ok, albo jeden czekał albo drugi. Teraz mam bufor rozmiaru 4 litery i występuje sytuacja gdzie jednocześnie jeden może zabierać a drugi oddawać produkt. Zbudowałem taką klase bufora jednak w momencie jak bufor się zapełni, konsument wezmie jeden produkt, bufor ponownie zapełni producent i nie wiem dlaczego konsument już nie chce zabierać. Pewnie bład w warunku kiedy konsument ma zabierać. Prosze o pomoc to pilne, a już mi się dwoi kod w oczach.
funkcja get czyta, natmiast put wkłada do bufora.
class Bufor
{
private char[] contents;
private boolean available = false;
private boolean available2 = false;
private boolean pauza=false;
public Lista lista = new Lista();
String text="";
int poz,pier,pom;
Bufor(int n)
{
contents = new char[n];
poz=0;
pier=n;
pom=0;
}
public synchronized int get(int kons){
while(pauza)
{
try
{
wait();
} catch (InterruptedException e) { }
}
text="Konsument #" + kons + " chce zabrac\n";
System.out.println(text);
lista.append(text);
lista.setCaretPosition(lista.getText().length());
while (available == false){
try {
text="Konsument #" + kons + " bufor pusty - czekam\n";
System.out.println(text);
lista.append(text);
lista.setCaretPosition(lista.getText().length());
wait();
} catch (InterruptedException e) { }
}
text="Konsument #" + kons + " zabral: " + contents[poz-1]+"\n";
System.out.println(text);
lista.append(text);
lista.setCaretPosition(lista.getText().length());
pom=poz;
poz=poz-1;
if(poz==0)
{
available = false;
available2= false;
}
if(poz<pier && poz>0)
{
available2= false;
available = true;
}
if(poz==pier)
{
available = true;
}
notifyAll();
return contents[pom];
}
public synchronized void put(int prod, char value){
while(pauza)
{
try
{
wait();
} catch (InterruptedException e) { }
}
text="Producent #" + prod + " chce oddac: " + value+"\n";
System.out.println(text);
lista.append(text);
lista.setCaretPosition(lista.getText().length());
while (available2 == true){
try {
text="Producent #" + prod + " bufor zajety - czekam\n";
System.out.println(text);
lista.append(text);
lista.setCaretPosition(lista.getText().length());
wait();
} catch (InterruptedException e) { }
}
contents[poz] = value;
poz++;
if(poz>0 && poz < pier)
{
available = true;
available2 = false;
}
if(poz==pier)
{
available2 = true;
available = true;
}
text="Producent #" + prod + " oddal: " + value+"\n";
System.out.println(text);
lista.append(text);
lista.setCaretPosition(lista.getText().length());
notifyAll();
}
Dziękuję za pomoc.