Wielowątkowość - synchronizacja

Odpowiedz Nowy wątek
Deimos
2008-01-03 19:43
Deimos
0

Mam takie zadanie:

Każdy wątek powinien w nieskończonej pętli wykonywać następujące czynności:

  1. zasypia na losowy czas (2-4s),
  2. losuje osobę z bazy,
  3. wypisuje imię poprzedzone swoim unikalnym numerem (przekazanym przy tworzeniu),
  4. zasypia na losowy okres (0.5-1.0s),
  5. wypisuje nazwisko poprzedzone swoim unikalnym numerem (przekazanym przy tworzeniu),

Czynności 3-5 powinny być zsynchronizowane tak żeby nie były podzielne. Jak to zrobić?
Gdy zrobię osobną metodę dla czynności 3-5 synchronized nic to nie daje ponieważ sleep wpuszcza inne wątki..
Jestem początkujący jeśli chodzi o jave. Pomocy

Pozostało 580 znaków

2008-01-03 20:27
Moderator

Rejestracja: 13 lat temu

Ostatnio: 32 sekundy temu

Lokalizacja: Stacktrace

0

nie musisz. Każdy wątek działa oddzielnie i nie musi być synchronizowany, ale w takim momencie kolejność ich działania bedzie czysto losowa.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Pozostało 580 znaków

Deimos
2008-01-03 20:44
Deimos
0

no wlasnie chodzi o to zeby nie była losowa tylko jak dam sleepa (4 czynnosc) to zeby inny watek wtedy nie wchodzil.

Pozostało 580 znaków

2008-01-04 08:06

Rejestracja: 12 lat temu

Ostatnio: 12 lat temu

0

Musisz użyć tutaj koncepcji monitora lub semafora wykorzystując słówko synchronized.

Synchronizuj wątki niekoniecznie przez metodę (czyli monitor) ale przez zmienną (czyli semafor) - tzn. na przykład tak:

class MyMonitor implements Runnable
{
    private static final Integer SEMAFOR = new Integer(0);

    public void run()
    {
        synchronized (SEMAFOR) {
            try
            {               
                System.out.println("Before delay:" + Thread.currentThread().getId());
                Thread.sleep(DELAY);
                System.out.println(Thread.currentThread().getId());
                Thread.sleep(DELAY);
            }            
            catch(InterruptedException e){}
        }
    }
    private int DELAY =10000;
}

Zobacz, że po wykonaiu kodu:

public static void main(String args[])
    {
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(new MyMonitor());
            t.start();
        }
    }

Wypisywane informacje się nie przeplatają. Usunięcie bloku synchronized(SEMAFOR) spowoduje przeplatanie wykonania.

Pozostało 580 znaków

mamalyga
2008-01-04 08:57
mamalyga
0

takie pytanie - a dlaczego masz koniecznie zasypiac miedzy imieniem a nazwiskiem? synchronizacja sleepa nie jest za dobrym pomyslem, poniewaz ta metoda nie oddaje locka monitora ktory posiada, wiec system bedzie spac po prostu i nic innego nie bedzie sie dzialo
no ale jesli takie jest zadania no to spoks, tylko po co

Pozostało 580 znaków

Deimos
2008-01-04 11:18
Deimos
0

Dzieki wielkie, pomogło. po prostu wykładowca wymyślił takie zadanie i tyle. Jeszcze raz dzięki.

Pozostało 580 znaków

Odpowiedz

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