Tak jak w temacie mam jednego producenta i jednego konsumenta
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