Synchronizacja wątków

Odpowiedz Nowy wątek
2009-03-10 00:07
creazy
0

Witam.

Czy mógłby mi ktoś wyjaśnić jak to działa , nie bardzo rozumiem na jakiej zasadzie działa metoda notify().
Załóżmy ze chciałbym aby dwa wątki naprzemiennie się uruchamiały tzn.

wątek1 jakis kod wait()
watek2 jakis kod wait()
watek1 jakis kod wait()
...

jak to zrobic ??

Pozostało 580 znaków

2009-03-10 08:48
0

Wait i notify nie służą do synchronizowania wątków. O ile jeszcze wait() można używać w blokach synchronizowanych do czekania to notify należy zastąpić odpowiednimi mechanizmami synchronizacji na przykład semaforami. W ostateczności jak lubisz sypiacy się kod polecam yield():

public class App {

    public static void main(String[] args) {
        Watek watek1 = new Watek("1");
        Watek watek2 = new Watek("2");
        watek1.start();
        watek2.start();
    }
}

class Watek extends Thread {

    public Watek(String name) {
        this.setName(name);
    }

    public void run() {
        while (true) {
            System.out.println("Jestem wątkiem " + getName());
            yield();
        }
    }
}

Pozostało 580 znaków

2009-03-10 09:40
halabala
0

Jezus Maryja, Koziolek, co ty prawisz ze herezje? notify() nie sluzy do synchronizacji? Uzywac yield()? Matko boska...

Pozostało 580 znaków

2009-03-10 09:52
creazy
0

dzieki za odpowiedz ale chodziło mi aby zrobic to za pomocą wait oraz notify .

Pozostało 580 znaków

2009-03-10 10:21
halabala
0


public class Test {

public static void main(String... args) {
    Object lock = new Object();
    Thread a = new Thread(new MyRunnable(lock, "A"));
    Thread b = new Thread(new MyRunnable(lock, "B"));
    a.start();
    b.start();
}

}

class MyRunnable implements Runnable {

private Object lock;

private String msg;

public MyRunnable(Object lock, String msg) {
    this.lock = lock;
    this.msg = msg;
}

public void run() {
    while (true) {
        synchronized (lock) {
            System.out.println(msg);
            lock.notify();
            try {
                Thread.sleep(500);
                lock.wait();
            } catch (InterruptedException exc) {
                // ignore
            }
        }
    }
}

}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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