20
 Visoka tehni  Visoka tehni č č ka ka š š kola Ni kola Ni š š Internet programiranje Internet programiranje (12) (12) Vi Vi š š enitno programiranje u Javi enitno programiranje u Javi dr Zoran Veli dr Zoran Veli č č kovi kovi ć ć, dipl. in , dipl. inž ž. el. . el. Decembar, 2012. Decembar, 2012. Studijski program: Studijski program: Savremene ra Savremene ra č č unarske tehnologije unarske tehnologije

12_Visenitno Programiranje u Javi

Embed Size (px)

Citation preview

Page 1: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 1/24

 Visoka tehni Visoka tehniččkaka šškola Nikola Nišš

Internet programiranjeInternet programiranje

(12)(12)

ViViššenitno programiranje u Javienitno programiranje u Javi

dr Zoran Velidr Zoran Veliččkovikovićć, dipl. in, dipl. inžž. el.. el.

Decembar, 2012.Decembar, 2012.

Studijski program:Studijski program:

Savremene raSavremene raččunarske tehnologijeunarske tehnologije

Page 2: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 2/24

 Vi Viššenitno programiranje (1)enitno programiranje (1) Java ima ugrađene mehanizmeugrađene mehanizme za istovremenoistovremeno izvršavanje

vivišše delovae delova programa.

Ovi delovi programadelovi programa nazivaju se nitiniti (engl. thread).

  ViViššenitni radenitni rad je specijalni slučaj viviššeprogramskogeprogramskog (engl.

multitasking) rada.

U viviššeprogramskomeprogramskom radu upravljanje izvršavanjem obavlja

operativni sistemoperativni sistem.

Kod viviššenitnog radaenitnog rada upravljanje izvršavanja obavlja samsam

programski jezik jezik JavaJava.

Koje su razlikerazlike između multitaskingamultitaskinga i rada sa viviššee

programskih nitiprogramskih niti?

Da li su Vam poznate programerskeprogramerske tehnike: poolingpooling i eventevent

loop?

Page 3: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 3/24

 Vi Viššenitno programiranje (2)enitno programiranje (2)Čitanjebloka 1

ČČitanjeitanjebloka 1bloka 1

Jedna nitJedna nit

ViVišše nitie niti

nit 1nit 1 nit 2nit 2 nit 3nit 3

Vreme

nitnit

Računanje1

RaRaččunanjeunanje11

Upis1

UpisUpis11

Čitanjebloka 2

ČČitanjeitanjebloka 2bloka 2

Računanje2

RaRaččunanjeunanje22

Upis2

UpisUpis22

Čitanjebloka 1

ČČitanjeitanjebloka 1bloka 1

Računanje1

RaRaččunanjeunanje11

Upis1

UpisUpis11

Čitanje

bloka 2

ČČitanjeitanjebloka 2bloka 2

Računanje

2

RaRaččunanjeunanje22

Upis

2

UpisUpis22

Čitanjebloka 3

ČČitanjeitanjebloka 3bloka 3

Računanje3

RaRaččunanjeunanje33

Upis3

UpisUpis33

Vreme

Page 4: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 4/24

 Vi Viššenitno programiranje (3)enitno programiranje (3) Programska nitnit može biti u stanju:

  izvrizvrššavanjaavanja,

 spremnosti za izvrspremnosti za izvrššenjeenje (odmah po dodeli proces. vrem.),

  suspenzijesuspenzije (aktivnost niti privremeno prekinuta),

 nastavak radanastavak rada (suspendovana nit nastavlja sa izvrš.),

  blokadeblokade (čeka pristup resursu). Svakoj programskoj niti se pridrupridružžujeuje određeni prioritetprioritet (u

formi celog broja koji odeđuje relativnirelativni raspored izvršavanja).

Nit može dobrovoljnodobrovoljno da preda kontrolupreda kontrolu ili kontrolu može dapreuzmepreuzme nit višeg prioriteta.

Kod niti sa istimistim prioritetom operativni sistemoperativni sistem (OSOS) treba da

reši problem prvenstvaprvenstva izvrizvrššavanjaavanja! Ovo je izvorizvor problemaproblema pri prenosu Java programa na druge

OSOS.

Page 5: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 5/24

 Vi Viššenitno programiranje (4)enitno programiranje (4) Zboz asinhrone prirodeasinhrone prirode niti je neophodno međusobno

sinhronizovatisinhronizovati monitorom i slanjem predefinisanihpredefinisanih poruka.

Osnova rada sa nitima su klasaklasa ThreadThread i interfejsinterfejs RunnableRunnable.

Klasa ThreadThread kapsulira nit koja se izvršava.

Klasa ThreadThread obezbeđuje vivišše metodae metoda za rad sa nitima:

MetodaMetoda ZnaZnaččenjeenje

get/setName()get/setName() VraVraćća/postavlja ime nitia/postavlja ime niti

get/setPriority()get/setPriority() VraVraćća/postavlja prioritet nitia/postavlja prioritet nitiisAlive()isAlive() Utvrđuje da li se nit izvrUtvrđuje da li se nit izvrššavaava

 join() join()   ČČeka da se nit zavreka da se nit završšii

run()run() Ulazna taUlazna taččka u nitka u nit

sleep()sleep() Privremeno zaustavljanje niti (suspenzija)Privremeno zaustavljanje niti (suspenzija)start()start() ZapoZapoččinje izvrinje izvrššavanja niti metodom runavanja niti metodom run

Page 6: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 6/24

Glavna programaska nitGlavna programaska nit  Glavna programska nitGlavna programska nit se automatski stvara pokretanjempokretanjem

programaprograma i njome se upravljaupravlja preko objekta ThreadThread.

Iz glavneglavne programske niti se startujuse startuju svesve drugedruge niti i iz njese vrši ččiiššććenjeenje radnog okruženja.

Radi upravljanjaupravljanja glavnomglavnom programskom niti potrebna je

njena referencareferenca koja se se dobija pozivom statistatiččke metodeke metodecurrentThread()currentThread() iz klase ThreadThread.

Metoda currentThread()currentThread() vraća referencureferencu na nit u kojoj je

pozvana.

Kada se dobije referencadobije referenca na glavnu programsku nitglavnu programsku nit, njome

se upravlja kao i svakom drugomdrugom niti.

Pogledajmo opšti oblik metode sleep()sleep():

staticstatic voidvoid sleep(sleep(longlong milisekunde)milisekunde) throwsthrows InterruptedExceptionInterruptedException

Page 7: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 7/24

Primer: Glavana programaska nitPrimer: Glavana programaska nitclassclass CurrentThreadDemo {CurrentThreadDemo {

publicpublic staticstatic voidvoid mainmain(String args[])(String args[]) { {

ThreadThread tt == ThreadThread.currentThread();.currentThread();System.out.println(System.out.println(““TekuTekućća nita nit: " + t);: " + t);

tt.setName("M.setName("Moja Nitoja Nit");");System.System.outout.println(.println(““Posle promene imenaPosle promene imena: " +: " + tt););

trytry { {

for(int n = 5; n > 0; nfor(int n = 5; n > 0; n----)) { {

System.System.outout.println(n);.println(n);

ThreadThread.sleep(1000);.sleep(1000);

 } }

 } } catchcatch (InterruptedException e)(InterruptedException e) { {System.System.outout.println("Main thread interrupted");.println("Main thread interrupted");

 } }  } }  } }

Dobijanje reference na naDobijanje reference na naglavnuglavnu programsku nitprogramsku nit

Promena imena niti saPromena imena niti sa setName()setName()

For pelja: Printa od 5 do 1, saFor pelja: Printa od 5 do 1, sa1sec. zadr1sec. zadržžavanjaavanja

Izuzetak koji moIzuzetak koji možže dae da

baci metodabaci metoda sleep()sleep()ako druga nit prekineovu suspendovanu nit

Pauza obezb. metodomPauza obezb. metodom sleep()sleep()

Page 8: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 8/24

Upotreba argumenta tt uu println()println() naredbi.naredbi.

Izlaz:

Tekuća nit: Thread[main,5,main]Posle promene imena: Thread[Moja Nit,5,main]

 Grupa nitiGrupa niti je struktura podataka koja upravlja stanjem skupaniti kao celinomkao celinom.

Nit se može napraviti obrazovanjem instanceinstance objekta tipa

ThreadThread.

Primer: Glavana programaska nitPrimer: Glavana programaska nit

ImeIme

grupegrupe nitiniti

Promena imenaPromena imena

glavne nitiglavne niti

Podrazumevano imePodrazumevano ime

glavne nitiglavne niti  - - mainmain

PrioritetPrioritet

nitiniti

Page 9: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 9/24

Pravljenje niti (1)Pravljenje niti (1) Nit se može napraviti na dva načina:

Realizacijom interfejsainterfejsa RunnableRunnable

Proširenjem klaseklase ThreadThread

Kada klasa realizuje interfejsinterfejs RunnableRunnable potrebno je da poseduje

merodu run()run() unutar koje se definiše programskiprogramski kodkod koji

predstavlja novunovu nitnit.

Deklaracija metode runrun je sledeća:

publicpublic voidvoid run()run()

Metoda run()run() može da poziva druge metode, koristi druge klase i

da deklariše promenljive isto kao i glavna nitglavna nit.

Metoda run()run() zapravo predstavlja ulaznu taulaznu taččkuku za drugudruguuporednu nituporednu nit izvršavanja.

 Nit se zavrNit se završšavaava kada se završi metoda runrun .

Page 10: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 10/24

Pravljenje niti (2)Pravljenje niti (2)ProgramProgram

main(){// kreiranje niti1// startovanje nit1

// kreiranje niti2

// startovanje nit2

// kreiranje niti3// startovanje nit3

 }

main(){// kreiranje niti1// startovanje nit1

// kreiranje niti2

// startovanje nit2

// kreiranje niti3// startovanje nit3 }

Nit 1Nit 1run(){

// Kod niti 1

 }

run(){

// Kod niti 1

 }Nit 2Nit 2run(){

// Kod niti 2

 }

run(){

// Kod niti 2

 }

Nit 3Nit 3run(){

// Kod niti 3

 }

run(){

// Kod niti 3

 }

SveSve ččetirietiri niti se moguniti se moguizvrizvrššavati konkurentnoavati konkurentno

Page 11: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 11/24

Raspoređ ivanje nitiRaspore

đ ivanje niti

Vreme

nit 1 nit 3nit 2 nit 4

nit 1

nit 2

nit 2

nit 1

nit 4

Page 12: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 12/24

Pravljenje niti (3)Pravljenje niti (3) Prvo se formira klasaklasa ThreadThread koja realizujerealizuje interfejsinterfejs

RunnableRunnable,, a potom se kreira instanca objekta tipa ThreadThread.

Jedan od konstruktorakonstruktora klase ThreadThread je:

ThreadThread(Runnable(Runnable objekatnitobjekatnit, String, String imenitiimeniti))

Za start izvrstart izvrššavanjaavanja niti poziva se njena metodametoda start()start()

deklarisana u unutar klase ThreadThread.

Metodom start()start() se zapravo upuupuććuje pozivuje poziv metodi run().

Metoda start()start() ima sledeću dekleraciju:

voidvoid start()start()

Instanca klase koja realizuje interfejsInstanca klase koja realizuje interfejs RunnableRunnable Ime nove nitiIme nove niti

Page 13: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 13/24

Pravljenje nove nitiPravljenje nove niticlassclass NNovaNitovaNit implementsimplements RunnableRunnable { { //// pravljenje niti, interfejsompravljenje niti, interfejsom

ThreadThread tt;;

NNovaNitovaNit()() { { //// kreiranje nove druge nitikreiranje nove druge niti

t =t = newnew Thread(Thread(this,this, "Demo"Demo NitNit");"); // this// this--nova nit poziva run() tekunova nit poziva run() tekuććeg obj.eg obj.

System.System.outout.println(".println("Potomak nitPotomak nit: " + t);: " + t);

tt.start();.start(); } } //// StartStartovanje izvrovanje izvrššenja nitienja niti -- pokrepokrećće petlju for u potomkue petlju for u potomku

publicpublic voidvoid run()run() { {

trytry { {

for(int i = 5; i > 0; ifor(int i = 5; i > 0; i----) {) {

System.System.outout.println(".println(" Potomak nitPotomak nit: " + i);: " + i);

ThreadThread.sleep(500);.sleep(500);

 } } } } catchcatch (InterruptedException(InterruptedException ee) {) {

System.System.outout.println(".println("Potomak nit prekinutaPotomak nit prekinuta.");.");

 } }

System.System.outout.println(".println("Izlazak iz potomak nitiIzlazak iz potomak niti.");."); } }

 } }

Jedan od Thread konstruktoraJedan od Thread konstruktora

Ulaz u nit, izvrUlaz u nit, izvrššni kodni kodniti. Implementiranjeniti. Implementiranje

run()run() metodemetode

PrivremenoPrivremenozaustavljanjezaustavljanjeizvrizvrššenje nitienje niti

KlasaKlasa NovaNitNovaNit kojakojarealizuje interfejsrealizuje interfejs

RunnableRunnable

Kod nitiKod niti

Page 14: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 14/24

IzvrIzvrššenje nove nitienje nove niticlassclass ThreadDemo {ThreadDemo {

publicpublic staticstatic voidvoid mainmain(String args[])(String args[]) { {

newnew NNovaNitovaNit();(); //// kkrereiranjeiranje nove nitinove niti

trytry { {

for(int i = 5; i > 0; ifor(int i = 5; i > 0; i----) {) {

System.System.outout.println(".println("Glavna nitGlavna nit: " + i);: " + i);

Thread.Thread.sleepsleep(1000);(1000);

 } }

 } } catchcatch (InterruptedException(InterruptedException ee) {) {System.System.outout.println(".println("Glavna nit prekinutaGlavna nit prekinuta.");.");

 } }

System.System.outout.println(".println("Izlazak iz glavne nitiIzlazak iz glavne niti.");."); } }

 }

Obe niti seObe niti se

izvrizvrššavaju deleavaju deleććiivremevreme

procesoraprocesora

Gl. Nit se u svakojGl. Nit se u svakojiteraciji zadriteraciji zadržžavaava

1000ms, a1000ms, a

potomak 500ms.potomak 500ms.

Page 15: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 15/24

Pravljenje niti klasom Thread (1)Pravljenje niti klasom Thread (1) Koako je već napomenuto, nit se može napraviti i

nasleđivanjemnasleđivanjem klase ThreadThread.

Nova potklasa moramora da redefiniredefiniššee metodu run()run() i onapredstavlja ulaznu taulaznu taččku u nitku u nit.

Metoda run()run() najčešće odmah poziva metodu start()start() da bi nova

nit počela da se izvršava. U nastavku je dat primer formiranja nove niti nasleđivanjem

klase ThreadThread.

Dodeljivanje pripritetapripriteta niti se obavlja primenom metodesetPriority()setPriority() koja je član klase ThreadThread:

finalfinal voidvoid setPriority(setPriority(intint nivo)nivo)

 Argument nivoArgument nivo ima vrednostivrednosti od 1 do 101 do 10.

 Prioritet nitiPrioritet niti se može dobiti preko metode finalfinal getPriority()getPriority()..

Page 16: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 16/24

//// Pravljenje druge niti nasleđ ivanjemPravljenje druge niti nasleđ ivanjem (pro(prošširavanjem) klaseiravanjem) klase ThreadThread

classclass NewThreadNewThread extendsextends Thread {Thread {

NewThread() {NewThread() {

supersuper("Demo("Demo NitNit");");

System.System.outout.println(.println(““Nit potomakNit potomak: " + this);: " + this);

start()start();;  } }

publicpublic voidvoid run() {run() {trytry { {

for(int i = 5; i > 0; ifor(int i = 5; i > 0; i----) {) {

System.oSystem.outut.println(.println(““Nit potomakNit potomak: " +: " + ii););

Thread.Thread.sleepsleep(500);(500);

 } }

 } }catchcatch (InterruptedException(InterruptedException ee))

 {System.o {System.outut.println(.println(““Prek. Nit potomak.Prek. Nit potomak.");}");}System.System.outout.println(.println(““Izlaz iz niti potomak.Izlaz iz niti potomak.");");

Pravljenje druge nove nitiPravljenje druge nove niti

Ulazna taUlazna taččka druge nitika druge niti

StartStartovanje nitiovanje niti

Konstruktor nove klaseKonstruktor nove klase

Pravljenje niti klasom Thread (2)Pravljenje niti klasom Thread (2)

Page 17: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 17/24

Pravljenje niti klasom Thread (3)Pravljenje niti klasom Thread (3)classclass ExtendThread {ExtendThread {

publicpublic staticstatic voidvoid mainmain(String args[]) {(String args[]) {

newnew NewThread();NewThread();

trytry { {

for(int i = 5; i > 0; ifor(int i = 5; i > 0; i----) {) {System.out.println("Main Thread: " + i);System.out.println("Main Thread: " + i);

Thread.Thread.sleepsleep(1000);(1000);

 } }

 } } catchcatch (InterruptedException(InterruptedException ee) {) {

System.System.outout.println("Main thread interrupted.");.println("Main thread interrupted.");

 } }

System.System.outout.println("Main thread exiting.");.println("Main thread exiting."); } }

Kreiranje nove nitiKreiranje nove niti

Rezultat je isti kaoRezultat je isti kaoiz prethodnogiz prethodnogprimeraprimera

Page 18: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 18/24

Sinhronizacija niti (1)Sinhronizacija niti (1)   SinhronizovanjeSinhronizovanje je programerski način da se resurs koristi

samosamo od jedne jedne niti u jednom jednom trenutku.

  MonitorMonitor je objekatobjekat u Javi koji se koristi za uzajamnouzajamnoiskljuisključčivanjeivanje niti.

  SamoSamo jedna nit jedna nit u jednom trenutku može biti u monitorumonitoru.

 Niti kojeNiti koje ččekajuekaju da “uđu” u monitor biće zadrzadržžaneane sve dokprva nit koja se nalazi monitoru ne izađeizađe iz njega.

Java za sinhronizovanje nitisinhronizovanje niti koristi rez. reč synchronizedsynchronized.

Page 19: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 19/24

Sinhronizacija niti (2)Sinhronizacija niti (2)class MyClass {class MyClass {

synchronizedsynchronized publicpublic voidvoid method1() {method1() {

// Code for the method...// Code for the method... } }

synchronizedsynchronized publicpublic voidvoid method2() {method2() {

// Code for the method...// Code for the method... } }

publicpublic voidvoid method3method3() {() {

// Code for the method...// Code for the method...

 } }

 } }

Metode deklarisaneMetode deklarisanerezervisanom rerezervisanom reććii

synhronizedsynhronized

Metode koji nijeMetode koji nije

deklarisan rezervisanomdeklarisan rezervisanomrereććii synhronizedsynhronized

Od dvaOd dva synhronizedsynhronized metoda, samo se jedan mometoda, samo se jedan možže izvre izvrššavati uavati uodređenom trenutkuodređenom trenutku. Metoda. Metoda method3method3 se mose možže izvre izvrššavati bezavati bez

obzira na izvrobzira na izvrššavanje synchronized metodaavanje synchronized metoda

Synhronized metode razliSynhronized metode različčitih objekata se mogu izvritih objekata se mogu izvrššavati istovremeno!avati istovremeno!

Page 20: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 20/24

Sinhronizacija niti (3)Sinhronizacija niti (3)

IZVRIZVRŠŠI, monitor nije zauzetI, monitor nije zauzet

obj1obj1synchronized

method1()

synchronizedmethod2()

method3()

synchronizedmethod1()

synchronizedmethod2()

method3()

Nit 1Nit 1

run() {

Obj1.method2();

 }

run() {

Obj1.method2();

 }

Nit 2Nit 2run() {

Obj1.method3();Obj1.method1();Obj1.method1();

 }

run() {

Obj1.method3();Obj1.method1();Obj1.method1();

 }

Nit 3Nit 3

run() {

Obj2.method3();Obj2.method2();

 }

run() {

Obj2.method3();Obj2.method2(); }

obj2obj2synchronized

method1()

synchronizedmethod2()

method3()

synchronizedmethod1()

synchronizedmethod2()

method3()

11

22

3344

5566

ČČEKAJ!, monitor zauzetEKAJ!, monitor zauzet

VremeII   IIII   IIIIII

Page 21: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 21/24

Sinhronizacija niti (4)Sinhronizacija niti (4) Dakle, saradnja dve asinhroneasinhrone programske niti se ostvaruje

njihovom međusobnom sinhronizacijomsinhronizacijom.

U Javi svaki objekatsvaki objekat ima svoj sopstvenisopstveni monitormonitor u koji seautomatski ulazi čim se pozove neka od sinhronizovanihsinhronizovanih

metodametoda.

  SamoSamo jedna nit

u jednom trenutkuu jednom trenutku može biti u monitoru.

Kada nit uđe u monitoruđe u monitor ona ga “zakljuzaključčaa”” (engl. lock).

 Monitor je objekatMonitor je objekat koji se koristi kao uzajamno iskljuuzajamno isključčivanjeivanje

bravabrava.

Ostale niti biće zadrzadržžaneane sve dok prva nit ne izađeizađe iz monitora.

 U monitorU monitor određenog objektaobjekta se ulazi pozivom metode koja je

modifikovana reč ju synchronizedsynchronized.

synchronizedsynchronized(objekat)(objekat) { { ...... // naredbe koje treba sinhronizovati// naredbe koje treba sinhronizovati

 } }

Page 22: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 22/24

Sinhronizacija niti (5)Sinhronizacija niti (5) Objekat predstavlja referencureferencu na objekat koji se sinhronizuje.

Na ovaj način se poziv metode može uputiti tek kada metodatek kada metoda

uđeuđe u monitor objekta. Dok nit boraviboravi unutar sinhronizovanesinhronizovane metodemetode, sve druge niti

koje upućuju poziv toj metodi iste instance objekta moraju damoraju da

ččekajuekaju.

  OgraniOgraniččenje pristupa nitienje pristupa niti se realizuje serijalizacijomserijalizacijom

pristupanju metodi (u ovom slučaju poziv()poziv())na sledeći način:

ClassClass PozoviMePozoviMe { {

synchronizedsynchronized voidvoid poziv(poziv(StringString poruka) { ..........poruka) { ..........

 } }

 Ako se sinhronizacijaAko se sinhronizacija ne može postići sinhronizovanimsinhronizovanimmetodamametodama treba pokušati sa sinhronizovanim objektimasinhronizovanim objektima.

Page 23: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 23/24

Upotreba sinhronizacionih nitiUpotreba sinhronizacionih niti

Rač

unarske operacijesu preklopljene

Banka

RaRaččun uun ubancibanci

Operacija potraživanja

Operacija dugovanja

Službenik 1

Službenik 2

Potraži-

vanje

Dugova-nje

Page 24: 12_Visenitno Programiranje u Javi

7/21/2019 12_Visenitno Programiranje u Javi

http://slidepdf.com/reader/full/12visenitno-programiranje-u-javi 24/24

Komuniciranje izmeđ 

u nitiKomuniciranje izmeđ 

u niti   KomunikacijaKomunikacija između nitiizmeđu niti se odvija posredstvom metodametoda:

Wait()Wait(), naredba za napuštanje monitora

Notify()Notify(),, ponovno pokretanje niti koja je pozvala metodu wait()istog objekta.

NotifyAll()NotifyAll(),, ponovno pokretanje svih niti koje su pozvale metodu

wait() istog objekta. Pristup će biti odobren samo jednoj od niti.

Ove metode su deklarisane u objektu ObjectObject i mogu se pozvati

samosamo iz sinhronizovanogsinhronizovanog objekta upotrebom naredbe

synchronizedsynchronized.

Ranije verzije Jave su koristile metode suspend()suspend() i resume()resume()definisane klasom ThreadThread.

  KadaKada treba raditi sa više niti? (Ako se napravi suviše

programskih niti, mogu se snizitisniziti performanse programa!).

Zašto?