Niti Flashcards
Uvod, race hazard, sin
Nit kontrole, visenitno programiranje, skupovi podataka nisu disjunktni, sinhronizacija=eksluzivan pristup podacima, izvrsavanje konkurentno ili paralelno
Kreiranje, pokretanje i zavrsavanje niti
Klasa Thread u standardnoj biblioteci
Metod start aktivira nit(ona postaje spremna) zatim se zavrsava metod
Nakon kreiranja nit se moze konfigurisati i/ili pokrenuti
VM pokrece run metod aktivne niti koji treba biti redefinisan u korisnickoj klasi jer standardan metod run ne radi nista
Kada metod run niti zavrsi, nit zavrsava izvrsavanje
Sleep i run izuzeci
Metoda run ne moze bacati izuzetke
Metod sleep moze da baci interrupted exception
Kreiranje niti Runnable interfejsom
Interfejs Runnable je apstrakcija koncepta aktivnog objekta, ima samo jednu metodu - run, klasa Thread implementira Runnable
Konstruktori klase Thread
public Thread(Runnable cilj)-koristi metod run objekta cilj
public Thread(Runnable cilj, String ime)
public Thread(ThreadGroup grupa, Runnable cilj)
public Thread(ThreadGroup grupa, Runnable cilj, String ime, long velicinaSteka)
Neki metodi klase Thread
public final void setName(String ime)
public final String getName()
public long getId()
boolean is Alive()
String toString()
public static Thread currentThread()
Zavrsavanje niti
Nit se normalno zavrsava po povratku iz njenog metoda run
Zastareli metodi za eksplicitno zaustavljanje stop i destroy
Prepureceno: postavi se uslov kraja metodom aktivnog objekta i u nekoj petlji metoda run se proverava taj uslov, ako je ispunjen nit sama zavrsi run metod
Suspendovanje i reaktiviranje niti
U prvoj verziji jave suspedn() i resume()- sada zastraeli metodi
Nit se moze suspendovati metodom sleep(), a reaktivirati slanjem signala prekid toj niti
Prekidanje niti
Nestaticki metod klase Thread interrupt()-salje signal prekida niti, postavlja joj statu prekida
Metodi za ispitivanje statusa prekida:
interrupted()- staticki metod,testira da li je tekuca nit bila prekinuta i menja status prekida
isInterrupted()-testira da li je ciljna nit prekinuta i ne menja status prekida
Prekidanje niti u blokiranom stanju
Poziv interrupt
-deblokira nit, izlazi se iz metoda koji je blokirao
-dati metod baca interrupted exception
-status prekida se ponistava ulaskom u catch granu
Cekanje da druga nit zavrsi
Po zavrsetku metode run objekat niti ne nestaje, moze se pristupiti njegovom stanju
Nit moze da ceka da druga nit zavrsi pozivom join() te druge niti
Oblici join
public final void join() throws InterruptedException
public final void join(long ms) throws InterruptedException
public final void join(long ms, int ns) throws InterruptedException
Neizvesnost trke
Dve niti mogu uporedo da citaju i menjaju polje nekog pasivnog objekta sto ga moze dovesti u nekozistentno stanje
Neizvesnost je u get-modify-set sekvenci
Resenje u javi se postize sinhronizacijom zasnovanom na bravi (lock) - dok jedan nit pristupa objektu on se zakljucava da spreci pristup druge niti
Sinhronizacija
Modifikator metoda synchronized aktivira mehanizam pristupa preko brave
Kada nit zakljuca objekat samo ta nit moze da mu pristupa
Ako vise niti pozove metode tog objekta, sve cekaju
Sinhronizacija omogucava uzajamno iskljucivanje niti nad zajednickim objektom
Konstruktor ne treba biti sinhronizovan
Dodata razlog protiv javnih podataka
Obrada ugnezdenih poziva
Sinhronizacija statickih metoda
Staticki sinhronizovani metodi rade sa bravom klase a ne bravom objekta, jer su to metodi klase a ne objekta
Dve niti ne mogu da izvrsavaju sinhronizovane staticke metode jedne klase u isto vreme
Jedna nit moze izvrsavati staticki sinhr metod dok druga izvrsava nestaticki sinhr metod- brava klase ne utice na brave objekta