Wielowątkowość - synchronizacja

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

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.

0

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

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.

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

0

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

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