220 likes | 393 Views
Višedretvenost u Javi. Nataša Cvrlje Voditelj: mr.sc. Marko Čupić. Programski jezik Java. 1990. James Gosling dizajnirao programski jezik Oak Razni projekti dali mogućnost Oak-u da se razvija i sazrijeva Sun Microsystems otkrio da je ime Oak već upotrijebljeno, te je promijenjeno u Java.
E N D
Višedretvenost u Javi Nataša Cvrlje Voditelj: mr.sc. Marko Čupić
Programski jezik Java • 1990. James Gosling dizajnirao programski jezik Oak • Razni projekti dali mogućnost Oak-u da se razvija i sazrijeva • Sun Microsystems otkrio da je ime Oak već upotrijebljeno, te je promijenjeno u Java.
Programski jezik Java • Java je: • jednostavni • objektno-orijentirani • višedretveni • siguran programski jezik • neovisan o platformi na kojoj se pokreće zbog posebnog međukoda (eng. byte-code)
Dretve • Računalo izvodi programe pripremljene u višem programskom jeziku. • Program se prevodi u strojni oblik proces. • Procesi u raznim fazama svojeg odvijanja raznoliko troše računalna sredstva • Omogućavamo da se više procesa odvija paralelno koristeći različita računalna sredstva.
Dretve • Dretva niz instrukcija programa • Suvremeni OS podržavaju izvođenje procesa s više dretvi (višedretvenost) • Oblik paralelizacije na razini procesa • Izvedbena okolina Java programa dopušta višedretveni način rada
Kreiranje dretvi • Aplikacija koja stvara primjerak razreda Thread : mora zadati kod koji će ta dretva izvršavati nakon što ju se pokrene • Prvi način : stvorimo primjerak razreda Runnable public class HelloRunnable implements Runnable { public void run() { System.out.println(“U ovoj metodi se obavlja posao dretve."); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } }
Kreiranje dretvi • Drugi način : stvorimo razred koji proširuje razred Thread public class HelloThread extends Thread { public void run() { System.out.println(“Pozdrav iz dretve!"); } public static void main(String args[]) { (new HelloThread()).start(); } } • Drugi način je jednostavniji za uporabu i bolji kad je u pitanju neka jednostavnija aplikacija
Osnovne operacije s dretvama • Pozivanje statičke metode Thread.sleep blokira izvršavanja dretve na određeni period vremena • Prekid (eng. Interrupt) je indikacija dretvi da prekine s obavljanjem trenutnog posla i da obavi neku drugu radnju • Dretva se smatra živom od trenutka neposredno prije početka izvođenja metode run() pa sve do trenutka povratka iz te iste metode.
Višedretvenost • Komunikacija dretvi se primarno sastoji od dijeljenja pristupa istim poljima i varijablama. • Moguće su dvije vrste pogreški. -interferencija dretvi -pogreške dosljednosti memorije
Višedretvenost • Interferencija se dogodi kada dvije operacije, koje se pokreću u različitim dretvama, pristupaju istim varijablama i memorijskim lokacijama u isto vrijeme. • Posljedica : različite dretve dobivaju različite informacije o istom podatku
Višedretvenost class Brojac { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; } }
Sinkronizirane metode • Dva osnovna načina sinkronizacije dretvi: • sinkronizirane metode • sinkronizirani blokovi naredbi • U deklaraciji metode dodajemo ključnu riječ synchronized • Što će se dogoditi ako više dretvi istovremeno pozove sinkronizirane metode nad istim objektom? • Samo jedna dretva će dobiti pristup metodi, ostale su blokirane
Atomarni pristup • Atomarna naredba : izvodi se u jednom koraku • Čak ni uvećavanje varijable za jedan nije atomarna naredba • Dodavanjem ključne riječi volatile u deklaraciju varijable činimo njeno pisanje i čitanje atomarnom naredbom
Mutexi • Kritični odsječci : djelovi koda koji koriste memorijske resurse nekog objekta što omogućuje pojavu pogreški ako to napravi više dretvi istovremeno • Za sinkronizaciju dretvi dovoljno zaštititi samo kritične odsječke • Osnovna ideja bi bila izgraditi mehanizam koji bi oponašao dvije metode: UđiUKritičniOdsječak(); IzađiIzKritičnogOdsječka();
Mutexi • Uloga mutexa jest da glumi objekt kontroler, a ostvaruje ju tako što ga koristimo u naredbi: synchronized(mutex){ ...//kriticni odsjecak } • Mutex učinkovito zamjenjuje naredbe : • UđiUKritičniOdsječak() : ulaskom u spomenuti blok • IzađiIzKritičnogOdsječka() : izlaskom iz bloka
Monitori • Sinkronizacija je izgrađena oko pojma složenih mutexa (eng. Intrinsic locks) koji se često nazivaju monitori • Dok god neka dretva posjeduje monitor , nijedna druga dretva ne može pristupiti resursima objekta. • Sve dretve koje za to vrijeme zatraže monitor, prelaze u blokirano stanje sve dok se monitor ne oslobodi. • Pri sinkronizaciji dretvi često se koriste metode wait(), notify(), te notifyAll() koje Java nudi kroz razred java.lang.Object.
Potpuni zastoj i izgladnjivanje • Potpuni zastoj (eng. deadlock) predstavlja mogućnost lošeg ostvarenja sinkronizacije dretvi gdje postoji mogućnost da dvije dretve ostanu zauvijek blokirane, svaka od njih čekajući da ova druga obavi neku radnju. • Izgladnjivanje nastaje kada dretva nije u mogućnosti dobivanja pristupa varijabli koju dijeli s drugim dretvama te zbog toga ne može napredovati. Ova situacija nastaje ako je tu varijablu zauzela neka druga dretva na duži period vremena.
KRAJ Hvala na pažnji!