jddipqd
Čuven
- Učlanjen(a)
- 17.10.2000
- Poruke
- 2,622
- Poena
- 725
Imam klase koje otprilike ovako izgledaju:
Za slučaj da se prvo napravi workshop, pa worker pa customer ovo bi trebalo da radi (ako sam ja dobro shvatio kako niti funkcionišu 😉 ):
Međutim, ako je blokiran, worker se ne budi kad stigne notifyAll(), a ako nije blokiran (za slučaj da se prvo napravi customer) ne konstatuje da red više nije prazan (odnosno workshop.queueSize() i dalje vraća 0).
U čemu je ovde problem?
Kod:
public class Worker extends Thread {
private Workshop workshop;
Worker(Workshop workshop) {
this.workshop = workshop;
start();
}
public void run() {
Customer current = workshop.getCustomer();
/* Radi nešto */
workshop.customerDone();
}
}
public class Customer extends Thread {
private Workshop workshop;
Customer(Workshop workshop) {
this.workshop = workshop;
start();
}
public void run() {
workshop.addToQueue(this);
}
}
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class Workshop {
private ConcurrentLinkedQueue<Customer> queue;
Workshop() {
queue = new ConcurrentLinkedQueue<Customer>();
}
public int queueSize() {
return queue.size();
}
public synchronized void addToQueue(Customer customer){
queue.add(customer);
notifyAll();
try {
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public synchronized Customer getCustomer() {
while (queueSize() == 0) {
try {
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public synchronized void customerDone() {
notifyAll();
}
}
- Worker pozove workshop.getCustomer().
- Pošto u redu nema nikoga blokira se na workshop.
- Customer pozove workshop.addToQueue(this) koja doda customera u red, obavesti sve workere koji čekaju na workshop i blokira customera koji ju je pozvao.
- Kada se worker probudi workshop.queueSize() više nije 0 i worker nastavlja sa radom.
Međutim, ako je blokiran, worker se ne budi kad stigne notifyAll(), a ako nije blokiran (za slučaj da se prvo napravi customer) ne konstatuje da red više nije prazan (odnosno workshop.queueSize() i dalje vraća 0).
U čemu je ovde problem?