objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•rühmatööde esitlus...

70
Objektorienteeritud programmeerimine 13. loeng 6. mai Eno Tõnisson 1

Upload: others

Post on 14-Oct-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Objektorienteeritud programmeerimine

13. loeng

6. mai

Eno Tõnisson

1

Page 2: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Kasutatud

• H. Heina loengumaterjalid

• J. Kiho Väike Java leksikon

• J. Kiho Java Programmeerimise aabits

• Y. D. Liang Introduction to Java Programming

• Java tutorial. Java kodulehel

• http://www.javabeginner.com/learn-java/

• A. C. Kak Programming with Objects: A Comparative Presentation of Object-Oriented Programming with C++ and Java

2

Page 3: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Eelmistes seeriates

• loeng

– dünaamilised andmestruktuurid

• praktikum

– andmestruktuurid, kontrolltöö

• tudengipäevad

• Estcube?

3

Page 4: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Umbes mitu tundi tegelesite eelmisel nädalal selle ainega (loeng+praktikum+iseseisvalt)?

1. paariline

4

1. 2. 3. 4. 5. 6. 7. 8.

0% 0% 0% 0%0%0%0%0%

1. 0-2 tundi

2. 2-4 tundi

3. 4-6 tundi

4. 6-8 tundi

5. 8-10 tundi

6. 10-12 tundi

7. 12-14 tundi

8. üle 14 tunni

Page 5: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Kuivõrd olete selle ainega graafikus? 1. paariline

5

1. 2. 3. 4. 5.

0% 0% 0%0%0%

1. Isegi ees

2. Täiesti graafikus

3. Veidi maas, aga saan ise hakkama

4. Kõvasti maas, vajan abi

5. Ei oska öelda

Page 6: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Umbes mitu tundi tegelesite eelmisel nädalal selle ainega (loeng+praktikum+iseseisvalt)?

2. paariline

6

1. 2. 3. 4. 5. 6. 7. 8.

0% 0% 0% 0%0%0%0%0%

1. 0-2 tundi

2. 2-4 tundi

3. 4-6 tundi

4. 6-8 tundi

5. 8-10 tundi

6. 10-12 tundi

7. 12-14 tundi

8. üle 14 tunni

Page 7: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Kuivõrd olete selle ainega graafikus? 2. paariline

7

1. 2. 3. 4. 5.

0% 0% 0%0%0%

1. Isegi ees

2. Täiesti graafikus

3. Veidi maas, aga saan ise hakkama

4. Kõvasti maas, vajan abi

5. Ei oska öelda

Page 8: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Täna

• Lõimed

• Eksamist

8

Page 9: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Edasi • 2. kontrolltöö

– 7., 9. ja 15. mail – ??? mai

• 3. rühmatöö • Rühmatööde esitlus

– veebileht – ettekanne

• Eksam – 27. mail, 3. ja 13. juunil

• 1. kontrolltöö järeltöö – 4. – 11. juuni üks aeg

• Loengute järelvastamine, kui punkte vähem kui 5 – kuni 31. mai või enne korduseksamit

• Praktikumide järelvastamine – kuni 16. nädala praktikumini 9

Page 10: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Korduseksam

• Korduseksamieelne 1. KT järeltöö

• Korduseksamieelne 2. KT järeltöö

• Korduseksam 20. juuni

10

Page 11: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Punktid

• Eksamile pääsemiseks peab olema

– praktikumidest (sh. rühmatööd) kogutud vähemalt 32 punkti,

– loengutest vähemalt 5 punkti.

• Eksamitöö 35 punkti.

• Eksami eel kõik punktid kogutud.

– Väljaarvatud 27. mai eksami puhul kolmapäevaste praktikumirühmade rühmatööde lõpuesitlus.

11

Page 12: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Teha mitut tegevust korraga!?

• Mängida

• Suhelda

• Süüa

• Õppida

• …

12

Page 14: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Multitegumtöötlus (multitasking) ja lõimtöötlus (multithreading)

• Multitegumtöötlus – Kaht või enamat tegumit täidetakse samaaegselt või

vaheldumisi – Näiteks CDmängija võib mängida samal ajal, kui teiste

programmidega töötatakse

• Lõimtöötlus – kaht või enamat sama programmi osa täidetakse

samaaegselt või vaheldumisi

• Lõim – iseseisvalt, teistest programmiosadest sõltumatult täidetav

programmiosa – teises protsessis asuv ja tema ressursse kasutav protsess

14

Page 15: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Ressursside kasutamine

• Ühine kasutamine

• Koostöö

15

Page 16: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Lõimed ja protsessid

• Protsessi võib vaadelda rakendusena, tal on käituskeskkond ja mälu.

• Üldiselt Java rakendus üks protsess – saab luua lisaprotsesse, kui isendeid

klassist ProcessBuilder.

• Lõimed on nn “kergekaalulised” (lightweight) protsessid, mis nõuavad vähem ressursse.

• Ühes protsessis võib töötada mitu lõime paralleelselt. • Mitmelõimelisus on Java platvormi omadus. • Igal Java programmil on vähemalt üks lõim – main

16

Page 17: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Miks lõimed head?

• Saab teha programmi efektiivsemaks

– Näiteks kuskilt tuleb mingeid andmeid oodata

• Erinevad lõimed samade andmete kallal

– hea

– ohtlik

17

Page 18: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Javas

• Javas iga lõim on seotud klassi java.lang.Thread isendiga.

• Lõime loomiseks on kaks põhilist moodust: – luua klassi java.lang.Thread alamklass ja kirjutada lõime

tegevus meetodisse run(); – luua liidest java.lang.Runnable realiseeriv klass ja

kirjutada lõime tegevus meetodisse run(). Lõime loomiseks luua klassi java.lang.Thread isend, mille konstruktorile anda ette antud klassi isend.

• Lõime käivitamiseks kasutada java.lang.Thread

meetodit start().

18

Page 19: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

1. moodus

19

public class Lõim extends Thread {

public Lõim(String s){

setName(s);

System.out.println(s + " konstruktoris");

}

public void run(){

System.out.println("Töötab lõim " +

getName());

}

}

Page 20: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

1. moodus

20

public class TestLõim {

public static void main(String[] args) {

Lõim t1 = new Lõim("Esimene");

t1.start();

Lõim t2 = new Lõim("Teine");

t2.start();

Lõim t3 = new Lõim("Kolmas");

t3.start();

System.out.println("t1 = " + t1);

System.out.println("t2 = " + t2);

System.out.println("t3 = " + t3);

}

}

Käivitab uue lõime (meetod run), juhtimine tuleb peameetodisse tagasi. Peameetod ja lõim töötavad edasi sõltumatult

Page 21: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Katsetame

• Klassid Lõim ja TestLõim

21

Page 22: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

start()

• t1.start()

• Kui me loome uue lõime objekti ja käivitame meetodi start(), siis me palume JVM luua uus täiendav lõim.

• Lõime käivitamisel pöördume meetodi start() poole. JVM pöördub ise meetodi run()poole, siis kui tuleb sobiv hetk.

• Kui pöörduda juba käivitunud lõime start() meetodi poole, siis JVM viskab erindi iIllegalThreadStateException

22

Page 23: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

23

Esimene konstruktoris

Teine konstruktoris

Kolmas konstruktoris

Töötab lõim Teine

t1 = Thread[Esimene,5,main]

t2 = Thread[Teine,5,]

t3 = Thread[Kolmas,5,main]

Töötab lõim Esimene

Töötab lõim Kolmas

lõime nimi, lõime prioriteet, rühma nimi

Miks pole rühma nime?

Page 24: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Lõimerühmad

• Saab ise teha – ThreadGroup

• Kõige juureks main

– Või siiski mitte

24

Page 25: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Taustal

25

public class JuurteJuurde {

public static void main( String[] args ){

ThreadGroup taustal =

Thread.currentThread().getThreadGroup().getParent();

taustal.list();

}

}

java.lang.ThreadGroup[name=system,maxpri=10]

Thread[Reference Handler,10,system]

Thread[Finalizer,8,system]

Thread[Signal Dispatcher,9,system]

Thread[Attach Listener,5,system]

java.lang.ThreadGroup[name=main,maxpri=10]

Thread[main,5,main]

Page 26: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Millised võivad ekraanile ilmuda?

26 1. 2. 3. 4. 5.

0% 0% 0%0%0%

public class AB12 {

public static class Lõim1 extends Thread {

public void run() {

System.out.print("A");

System.out.print("B");

}

}

public static class Lõim2 extends Thread {

public void run() {

System.out.print("1");

System.out.print("2");

}

}

public static void main(String[] args) {

new Lõim1().start();

new Lõim2().start();

}

}

1. ABAB

2. 12AB

3. A12B

4. BA12

5. A1B2

Page 27: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Millised võivad ekraanile ilmuda?

27 1. 2. 3. 4. 5.

0% 0% 0%0%0%

public class AB12 {

public static class Lõim1 extends Thread {

public void run() {

System.out.print("A");

System.out.print("B");

}

}

public static class Lõim2 extends Thread {

public void run() {

System.out.print("1");

System.out.print("2");

}

}

public static void main(String[] args) {

new Lõim2().run();

new Lõim1().run();

}

}

1. ABAB

2. 12AB

3. A12B

4. BA12

5. A1B2

Page 28: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

start() või run()

• Las JVM pöördub ise run() poole.

28

Page 29: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

2. moodus lõimede tegemiseks

29

public class PrindiArvud implements Runnable{

private int esimeneArv;

private int viimaneArv;

public PrindiArvud(int n1, int n2) {

esimeneArv = n1;

viimaneArv = n2;

}

public void run() {

for (int i = esimeneArv; i <= viimaneArv; i++) {

System.out.print(i + "; ");

}

}

}

Page 30: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

2. moodus

30

public class TestPrindiArvud {

public static void main(String[] args) {

Runnable r1 = new PrindiArvud(1, 10);

Runnable r2 = new PrindiArvud(20, 30);

Runnable r3 = new PrindiArvud(50, 60);

Thread t1 = new Thread(r1);

Thread t2 = new Thread(r2);

Thread t3 = new Thread(r3);

t1.start();

t2.start();

t3.start();

}

}

1; 2; 3; 20; 21; 22; 23; 24; 25; 26; 27; 28; 50; 51; 52; 53; 54; 55; 56; 29; 4; 57; 30; 58; 59; 60; 5; 6; 7; 8; 9; 10;

Page 31: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Mooduste võrdlemine

• Klassi Thread alamklass

– lihtsam

• Realiseerida liides Runnable

– üldisem, ei pea olema klassi Thread alamklass

– parem kõrgema taseme lõimetöötluse jaoks

31

Page 32: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Klass Thread

• Konstruktorid – Thread()

– Thread(String name)

– Thread(Runnable target)

– Thread(ThreadGroup group, Runnable target,

String name)

– …

• Vaikimisi nimi "Thread-"+n

32

Page 33: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Klass Thread

• meetodeid – getPriority()

– getState()

– interrupt()

– isAlive()

– isDaemon()

– join()

– run()

– setPriority(int newPriority)

– sleep(long millis)

– start()

– …

33

Page 34: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

“Elus”

• start() on tehtud ja run() ei ole lõpuni täidetud

• isAlive()

• Lisame klass TestLõim

System.out.println("t1 = " + t1

+ " " + t1.isAlive());

34

Page 35: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Mis on t1.isAlive() väärtus?

35 1. 2.

0%0%

Lõim t1 = new Lõim("Esimene");

System.out.println(t1.isAlive());

t1.start();

1. true

2. false

Page 36: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Mis on t1.isAlive() väärtus?

36 1. 2.

0%0%

Lõim t1 = new Lõim("Esimene");

t1.start();

System.out.println(t1.isAlive());

1. true

2. false

Page 37: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Mis on t1.isAlive() väärtus?

37 1. 2.

0%0%

Lõim t1 = new Lõim("Esimene");

t1.run();

System.out.println(t1.isAlive());

1. true

2. false

Page 38: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Mis on t1.getState() väärtus?

38 1. 2. 3. 4. 5. 6.

0% 0% 0%0%0%0%

Lõim t1 = new Lõim("Esimene");

System.out.println(t1.getState());

t1.start();

1. NEW

2. RUNNABLE

3. BLOCKED

4. WAITING

5. TIMED_WAITING

6. TERMINATED

Page 39: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Mis on t1.getState() väärtus?

39 1. 2. 3. 4. 5. 6.

0% 0% 0%0%0%0%

Lõim t1 = new Lõim("Esimene");

t1.start();

System.out.println(t1.getState());

1. NEW

2. RUNNABLE

3. BLOCKED

4. WAITING

5. TIMED_WAITING

6. TERMINATED

Page 40: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Lõime seisundid

• NEW A thread that has not yet started is in this state.

• RUNNABLE A thread executing in the Java virtual machine is in this state.

• BLOCKED A thread that is blocked waiting for a monitor lock is in this state.

• WAITING A thread that is waiting indefinitely for another thread to perform a particular action is in this state.

• TIMED_WAITING A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.

• TERMINATED A thread that has exited is in this state.

40

Page 41: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

41

Page 42: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Millal terminated?

• NEW ja RUNNABLE juba olid.

• Klassi TestLõim lõppu

System.out.println(t1.getState());

42

Page 43: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

43

public class Lõim1 extends Thread {

public Lõim1(String s){

setName(s);

System.out.println(s + " konstruktoris" );

}

public void run(){

System.out.println("Töötab lõim " +

getName());

if (getName().equals("Unine")){

try {

Thread.sleep(9000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

Page 44: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

44

public class TestLõim1 {

public static void main(String[] args) {

Lõim1 t1 = new Lõim1("Esimene");

t1.start();

Lõim1 t2 = new Lõim1("Teine");

t2.start();

Lõim1 t3 = new Lõim1("Unine");

t3.start();

System.out.println("t1 = " + t1);

System.out.println("t2 = " + t2);

System.out.println("t3 = " + t3);

System.out.println("t3 = " + t3.getState());

}

}

Vahel RUNNABLE, vahel TIMED_WAITING, vahel BLOCKED

Kui panna pikem aeg

Page 45: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Ei sekkunud teise lõime tegemistesse (otseselt)

• Katkestamine – t3.interrupt()

• Oodata kuni teine on lõppenud – t3.join()

45

Page 46: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

46

public class TestLõim1 {

public static void main(String[] args) {

Lõim1 t1 = new Lõim1("Esimene");

t1.start();

Lõim1 t2 = new Lõim1("Teine");

t2.start();

Lõim1 t3 = new Lõim1("Unine");

t3.start();

System.out.println("t1 = " + t1);

System.out.println("t2 = " + t2);

System.out.println("t3 = " + t3);

t3.interrupt();

}

} …

Töötab lõim Unine

java.lang.InterruptedException: sleep interrupted

at java.lang.Thread.sleep(Native Method)

at Lõim1.run(Lõim1.java:11)

Lõime Unine run() viimane

Page 47: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

47

public class TestLõim1 {

public static void main(String[] args) {

Lõim1 t1 = new Lõim1("Esimene");

t1.start();

Lõim1 t2 = new Lõim1("Teine");

t2.start();

Lõim1 t3 = new Lõim1("Unine");

t3.start();

t3.join();

System.out.println("t1 = " + t1);

System.out.println("t2 = " + t2);

System.out.println("t3 = " + t3);

}

}

Main lõpetab pärast t3.

Page 48: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Tahaks kasutada samu andmeid

• Mured – lõimede vastastikune mõju (thread interference)

• ka üks direktiiv võib JVM mõttes olla mitmesammuline – Näiteks c++ korral 3 sammu

– Kui teine lõim teeb c--

– mälu terviklikkus (memory consistency) • kui erinevate lõimede “arusaam” andmetest ei ole

sama

• juhtub-varem seos (happens-before)

• Lahenduseks on sünkroniseerimine

48

Page 49: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Sünkroniseerimine

• Anda ühele lõimele juurdepääs ja blokeerida samal ajal teisi

• “Lukustada” ühe lõime jaoks

49

Page 50: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Sünkroniseerimine

• Java koodi saab sünkroniseerida kahel viisil:

– meetodi sünkroniseerimine synchronized void meetod(){

...

}

– koodilõigu sünkroniseerimine synchronized(objekt) {

}

50

Page 51: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Ei sünkroniseeri

51

public class Helistamine {

void helista(String jutt) {

//helistamise algus

System.out.print("[" + jutt);

try {

Thread.sleep(1000);

} catch(InterruptedException e) {

System.out.println("Katkestatud");

}

System.out.println("]");

//helistamise lõpp

}

}

Page 52: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Ei sünkroniseeri

52

public class Helistaja implements Runnable {

String jutt;

Helistamine h;

Thread t;

public Helistaja(Helistamine h, String s) {

this.h = h;

jutt = s;

t = new Thread(this);

t.start();

}

public void run() {

h.helista(jutt);

}

}

Page 53: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Ei sünkroniseeri

53

public class TestHelistamine {

public static void main(String[] args) {

Helistamine h = new Helistamine();

Helistaja ob1 = new Helistaja(h, "Esimene");

Helistaja ob2 = new Helistaja(h, "Teine");

Helistaja ob3 = new Helistaja(h, "Kolmas");

}

}

[Teine[Esimene[Kolmas]

]

]

Page 54: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Sünkroniseerime

54

public class Helistamine {

synchronized void helista(String jutt) {

//helistamise algus

System.out.print("[" + jutt);

try {

Thread.sleep(1000);

} catch(InterruptedException e) {

System.out.println("Katkestatud");

}

System.out.println("]");

//helistamise lõpp

}

}

[Teine]

[Kolmas]

[Esimene]

Page 55: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Sünkroniseerime teistmoodi

55

void helista(String jutt) {

//helistamise algus

synchronized(this) {

System.out.print("[" + jutt);

try {

Thread.sleep(1000);

} catch(InterruptedException e) {

System.out.println("Katkestatud");

}

System.out.println("]");

//helistamise lõpp

}

}

[Teine]

[Kolmas]

[Esimene]

Page 56: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Aga mis juhtus? • Helistamine h = new Helistamine();

Helistaja ob1 = new Helistaja(h, "Esimene");

• public Helistaja(Helistamine h, String s) {

this.h = h;

jutt = s;

t = new Thread(this);

t.start();

}

public void run() {

h.helista(jutt);

}

}

• synchronized void helista

– helista on klassi Helistamine isendimeetod

– h on lukustatud ob1 lõime jaoks 56

Page 57: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Kas helista tehakse kindlasti ühe hooga lõpuni ?

57 1. 2.

0%0%

Helistamine h = new Helistamine();

Helistamine h1 = new Helistamine();

Helistamine h2 = new Helistamine();

Helistaja ob1 = new Helistaja(h, "Esimene");

Helistaja ob2 = new Helistaja(h1, "Teine");

Helistaja ob3 = new Helistaja(h2, "Kolmas");

1. Jah

2. Ei

Page 58: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Monitor

• Sünkroniseerimine on korraldatud monitoride abil – monitor, intrinsic lock, monitor lock

• Iga objektiga on seotud oma monitor. (Ka klassiga, kui klassi Class isendiga.)

• Kui lõim kutsub välja sünkroniseeritud meetodi (või jõuab sünkroniseeritud koodilõiguni), siis saab see lõim vastava objekti monitori endale. Kuni meetodist naasmiseni (või koodilõigu lõpuni).

• Ühel hetkel saab konkreetne monitor olla vaid ühel lõimel. • Kõik ülejäänud lõimed, mis tahavad monitori, peavad

ootama. 58

Page 59: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Lõimedevaheline suhtlemine

• Klassi Object isendimeetodid – wait

– notify

– notifyAll

• obj.wait()

– peatab jooksva lõime töö niikauaks, kuni mingi teine lõim saadab teate obj.notify() või obj.notifyAll().

– on ka wait(millisekundeid) versioon, mille toimel lõim "ärkab" ka etteantud aja pärast.

59

Page 60: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Prioriteedid

• Igal lõimel on prioriteet – täisarv 1 kuni10 • Kõrgema prioriteediga lõimedel on eelis madalama

prioriteediga lõimede ees. • Vaikimisi prioriteet on 5 • Meetodid

– setPriority(), – getPriority()

• Konstandid – MAX_PRIORITY, – MIN_PRIORITY, – NORM_PRIORITY

• Lõimede juhtimise konkreetne strateegia on platvormist

sõltuv. 60

Page 61: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Palju asju veel

• Deemonlõimed (Daemon threads)

– Käituskeskonnaga (runtime environment ) seotud tööd.

• Tupikud (Deadlocks)

– Lõimed igavesti blokeeritud, ootavad üksteise järel.

• …

• …

61

Page 62: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Eksamist

• Formaat

– 90 minutit

– ilma arvutiteta

– ilma materjalideta

– 35 punkti

62

Page 63: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Eksamist

• Teemad

– Loenguteemad

• Vajadusel lisatakse ülesandele selgitavat materjali (API, lõike loengu- või praktikumimaterjalidest)

63

Page 64: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Ülesannetest • Mis ilmub ekraanile?

– ilma etteantud vastusteta

– valikvastustega

– selgitada

• Mida teeb järgmine meetod?

• Leida viga (aga siis tõesti viga on)

• Klikkeriküsimustel põhinevaid – millised keerulisemad

• jätta välja

• selgitada

• … 64

Page 65: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Järgmistes loengutes

• 14. nädal

– Elemendid lokaliseerimisest ja võrguprogrammeerimisest

– Eksamist

• 15. nädal

– Kordamine

65

Page 66: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Loengu tempo oli 1. paariline

66 1. 2. 3.

0% 0%0%

1. liiga kiire

2. paras

3. liiga aeglane

Page 67: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Materjal tundus 1. paariline

67 1. 2. 3.

0% 0%0%

1. liiga lihtne

2. parajalt jõukohane

3. liiga keeruline

Page 68: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Loengu tempo oli 2. paariline

68 1. 2. 3.

0% 0%0%

1. liiga kiire

2. paras

3. liiga aeglane

Page 69: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Materjal tundus 2. paariline

69 1. 2. 3.

0% 0%0%

1. liiga lihtne

2. parajalt jõukohane

3. liiga keeruline

Page 70: Objektorienteeritud programmeeriminekodu.ut.ee/~eno/oop13/oop13loeng13.pdf•Rühmatööde esitlus –veebileht –ettekanne •Eksam –27. mail, 3. ja 13. juunil •1. kontrolltöö

Suur tänu osalemast! Kohtumiseni!

70