Producent-konsument - prosba sprawdzenia kodu

Producent-konsument - prosba sprawdzenia kodu
KD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 194
0

Tak jak w temacie mam jednego producenta i jednego konsumenta

Kopiuj
class Drop {
	private String message;
	private boolean empty = true;

	public synchronized void add(String message) {
		while (!empty) {
			try {
				wait();
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}// Koniec while
		this.message = message;
		System.out.println(Thread.currentThread().getName() + " " + message);
		empty = false;
		notifyAll();
	}// Koniec add

	public synchronized String get() {
		while (empty) {
			try {
				wait();
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}// Koniec while
		empty = true;
		notifyAll();
		return message;
	}// Koniec get
}

class Producer implements Runnable {
	private Drop d;

	Producer(Drop d) {
		this.d = d;
	}

	@Override
	public void run() {
		String messages[] = { "1", "2", "3", "4", "5", "6" };
		for (int i = 0; i < messages.length; i++) {
			d.add(messages[i]);
		}
		d.add("Koniec");
	}
}

class Consumer implements Runnable {
	private Drop d;
	private String message;

	Consumer(Drop d) {
		this.d = d;
	}

	@Override
	public void run() {
		message = d.get();
		while (!message.equals("Koniec")) {
			System.out
					.println(Thread.currentThread().getName() + " " + message);
			message = d.get();
		}
	}
}

public class ProducerConsumer {
	public static void main(String[] args) {
		Drop d = new Drop();
		Thread producer = new Thread(new Producer(d));
		Thread consumer = new Thread(new Consumer(d));
		producer.setName("Producent");
		consumer.setName("Konsument");
		producer.start();
		consumer.start();
	}
}

A to wynik dzialania mojego programu:
Producent 1
Producent 2
Konsument 1
Konsument 2
Producent 3
Konsument 3
Producent 4
Konsument 4
Producent 5
Konsument 5
Producent 6
Producent Koniec
Konsument 6

I teraz czemu producent dodaje najpierw 1 a potem 2 i dopiero wlacza sie watek Konsumenta, jak dla mnie to oni powinni dzialac na przemian raz producent a pozniej konsument. I czy to jest tak ze jak wywoluje metode wait na rzecz watku producenta to czy nie powinien on oddac czasu procesora i poczekac az watek konsumenta wznowi go przez notifyAll() a jesli tak to czemu w tym kodzie tak to nie dziala?

Z gory dzieki za wszelka pomoc

niezdecydowany
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Bieszczady
1

Czy zdajesz sobie sprawę że ktoś już rozwiązał twój problem ? ahh #magistry
http://www.journaldev.com/1034/java-blockingqueue-example-implementing-producer-consumer-problem

KD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 194
0

Spoko dzieki za porade, rozumiem ze proponujesz mi zeby to umiescic w kolejce natomiast ja to chcialem zrobic bez uzywania kontenera i znalazlem juz blad. Po prostu jest tak ze po wyjsciu z metody get() watek konsumenta moze oddac czas procesora jeszcze zanim dojdzie do System.out.println(....), dlatego producent moze sie pojawic Producent 1 Producent 2 itd . Ale dzieki za cierpliwosc dla mojej ignoracji odnosnie watkow :)

KD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 194
0

I jakby to kogos interesowalo kiedys to wrzucam kod, ktory dziala zgodnie z moim zamyslem:

Kopiuj
class Drop {
	private String message;
	private boolean empty = true;

	public synchronized void add(String message) {
		while (!empty) {
			try {
				wait();
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}// Koniec while
		this.message = message;
		System.out.println(Thread.currentThread().getName() + " " + message);
		empty = false;
		notifyAll();
	}// Koniec add

	public synchronized String get() {
		while (empty) {
			try {
				wait();
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}// Koniec while
		empty = true;
		notifyAll();
		return message;
	}// Koniec get
}

class Producer implements Runnable {
	private Drop d;

	Producer(Drop d) {
		this.d = d;
	}

	@Override
	public void run() {
		String messages[] = { "1", "2", "3", "4", "5", "6" };
		for (int i = 0; i < messages.length; i++) {
			d.add(messages[i]);
		}
		d.add("Koniec");
	}
}

class Consumer implements Runnable {
	private Drop d;
	private String message;

	Consumer(Drop d) {
		this.d = d;

	}

	@Override
	public void run() {
		synchronized (d) {
			message = d.get();
			while (!message.equals("Koniec")) {
				System.out.println(Thread.currentThread().getName() + " "
						+ message);
				message = d.get();
			}
		}
	}
}

public class ProducerConsumer {
	public static void main(String[] args) {
		Drop d = new Drop();
		Thread producer = new Thread(new Producer(d));
		Thread consumer = new Thread(new Consumer(d));
		producer.setName("Producent");
		consumer.setName("Konsument");
		producer.start();
		consumer.start();
	}
}

I efekt dzialania :
Producent 1
Konsument 1
Producent 2
Konsument 2
Producent 3
Konsument 3
Producent 4
Konsument 4
Producent 5
Konsument 5
Producent 6
Konsument 6
Producent Koniec

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.