Synchronized Problem Konsumenta i Producenta

0

Witam,

Jak zaimplementowac zamek by program przechodzil po wykonaniu watku w nastepny.

Wynik jaki otrzymuje to:

++++++-----

A bym chcial otrzymywac wynik

+-+-+-+-+-+-+-

Wiem ze musze uzyc
synchronized()
notify()
wait()

Program jest rozbity na mniejsze czesci, main znajduje sie w osobnym pliku:

public class ChancyDrop implements Drop {
	static Object w = new Object();
	
    int value;
    
   
    
    
    public int take() throws InterruptedException {
	return value;
    }
    
    public void put(int value) throws InterruptedException {
	this.value = value;
    }
    
    
    
}
0

Tworzysz dwa wątki o nazwach (nadanych przez setThreadName) t1 i t2 i następnie wywołujesz notify z nazwą tego drugiego wątku. Jest to rozwiązanie toporne, ale w miarę skuteczne. Inną metodą jest zastosowanie semaforów i ich naprzemienne otwieranie i zamykanie.

0
Koziołek napisał(a)

Tworzysz dwa wątki o nazwach (nadanych przez setThreadName) t1 i t2 i następnie wywołujesz notify z nazwą tego drugiego wątku.

Koziolek, mozesz powiedziec o jakim API mowisz? Nie znam metody notify() ktora bierze watek jako parametr. Jesli mowisz o Object.notify() to wlasnie po raz kolejny piszac w watku na temat...watkow pokazales jak mala masz wiedze na ten temat. Nie pisz wiecej takich bzdur, czlowieku, tylko niepotrzebnie mieszasz w glowach.

@Autor watku: poszukaj na forum, wiele razy byly podawane podobne przyklady.

0

Dobra dziękuje ślicznie za pomoc nieomieszkam poszukać.

0

Ja mam tylko pytanie po co?
Przeciez jak program ma efekt taki:
+-+-+-+-+-...
to jest lepiej wrzucić to w jeden wątek (po co przełaczac kontekst?)
pozdrawiam

0

Pewnie po to, by się nauczyć?:P
Sorry za offtopic

0

Proponuję dwa zupełnie inne rozwiązania:

  1. http://java.sun.com/javase/6/docs/api/java/util/concurrent/ArrayBlockingQueue.html o rozmiarze 1
    lub
  2. http://java.sun.com/javase/6/docs/api/java/util/concurrent/SynchronousQueue.html

W obu przypadkach interesują Cię metody put i take.

0

@__krzysiek85, zapewne zadanie jest w stylu użyj notify i wait, czyli rzeczy, które w Javie są delikatnie mówiąc dość wątpliwej jakości i zostały zastąpione wysokopoziomowymi rozwiązaniami.

0
Koziołek napisał(a)

@__krzysiek85, zapewne zadanie jest w stylu użyj notify i wait, czyli rzeczy, które w Javie są delikatnie mówiąc dość wątpliwej jakości i zostały zastąpione wysokopoziomowymi rozwiązaniami.

Sam jestes watpliwej jakosci. Te mechanizmy sa bardzo niskopoziomowe, i to wszystko. A co do tego po co, na bank to jest zadanie do szkoly, przeciez sam by sobie nie dal wymagac ze ma uzyc synchronized, wait i notify nie wiedzac wcale co to jest, prawda?

0

Cześć. Przykładowa implementacja korzystająca z Klas Semaphore jest tutaj:

http://black007.dlinkddns.com/svn/MainRepo/ReadersWriters/
To moje domowe repo i działa tylko, jak jestem na kompie.

Program może się nie kompilować, bo robiłem refactor dla kolegi na zaliczenie za kasę i teraz mój eclipse coś nie chce z nim gadać, ale pokazuje jak działają semafory.

a tutaj: http://black007.dlinkddns.com/svn/MainRepo/Philosophers/
mamy głodnych filozofów.

Pozdrawiam.

0
public class ChancyDrop implements Drop {      
   int value;
   boolean empty = true;
   
    public synchronized int take() throws InterruptedException {
        while(empty){
            wait();
        }
        empty = true;
        notifyAll();
        return value;
    }
   
    public synchronized void put(int value) throws InterruptedException {
        while(!empty){
            wait();
        }
        empty = false;
        this.value = value;
        notifyAll();
    }   
}

Pisałem bez kompilatora, więc mogą być literówki.

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