[SOLVED] Synchronizacja wątków, bufor i problem producent konsument PILNE

0

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.

0

Rozwiązałem problem. Problemem było to ze funkcja get zwracała wartość zawsze. to poprawny kod, może sie komuś przyda.

class Bufor
{
	private char[] contents;
	private boolean czyta= false;
	private boolean pisze = true;
	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 void 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 (czyta == false){
			try {
				  text="Konsument #" + kons + "   bufor pusty - czekam\n";
				  System.out.println(text);

		 		  lista.append(text);
                  lista.setCaretPosition(lista.getText().length());

				  pisze = true;
				  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--;

        if(poz==0)
        {
        	czyta=false;
        	pisze=true;
        	notifyAll();
        }

        if(poz==pier)
        {
        	czyta=true;
        	pisze=false;
        	notifyAll();
        }

        if(poz>0 && poz<pier)
        {
        	czyta=true;
        	pisze=true;
        	notifyAll();
        }
		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 (pisze == false){
			try {
			      text="Producent #" + prod + "   bufor zajety - czekam\n";
				  System.out.println(text);

		 		  lista.append(text);
                  lista.setCaretPosition(lista.getText().length());
			      czyta = true;
				  wait();

				} catch (InterruptedException e) { }
		}
		contents[poz] = value;
		poz++;

		text="Producent #" + prod + "       oddal: " + value+"\n";
		System.out.println(text);

		lista.append(text);
        lista.setCaretPosition(lista.getText().length());


		if(poz==0)
		{
			czyta=false;
			pisze=true;
			notifyAll();
		}
		if(poz==pier)
		{
			czyta=true;
			pisze=false;
			notifyAll();
		}
		if(poz>0 && poz<pier)
		{
			czyta=true;
			pisze=true;
			notifyAll();
		}

		notifyAll();

	}


	public synchronized void start()
	{
		pauza=false;
		notifyAll();
	}

	public synchronized void stop()
	{
		pauza=true;
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1