You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/11_rinnakkaisuus.md
+4-3Lines changed: 4 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -95,7 +95,7 @@ class DemoSäie implements Runnable {
95
95
}
96
96
}
97
97
```
98
-
Usein on tarpeen tietää milloin säie on päättynyt. Säikeen suoritus päättyy, kun run()-metodi on suoritettu tai koodi kaatuu virheeseen. Säie ei ilmoita päättymisestä silloin kun käytetään säikeitä tähän mennessä näkyvien esimerkkien mukaisesti. On olemassa myös toimintomalli, jossa saadaan ilmoitus käynnistävälle koodille säikeen päättymisestä. Muutoin on vaihtoehtona kysyä pollaamalla säikeen tilaa tai 'liittyä' säikeeseen join()-metodilla. Näissä pitää huolehtia mahdollisesta poikkeuksesta. Metodi sleep() aiheuttaa säikeen siirtymisen pois suorituksesta parametrina olevan millisekuntimäärän ajaksi. Pollaavassa versiossa kannattaa odottaa tovi ennen kuin kysyy uudelleen säikeen tilaa isAlive()-metodilla. Pollaus tarkoittaa sitä, että kysytään (poll) säikeen tilaa, koodissa siis aktiivisesti seurataan säikeen suorituksen tilaa.
98
+
Usein on tarpeen tietää milloin säie on päättynyt. Säikeen suoritus päättyy, kun run()-metodi on suoritettu loppuun tai koodi kaatuu virheeseen. Säie ei ilmoita päättymisestä silloin kun käytetään säikeitä tähän mennessä näkyvien esimerkkien mukaisesti. On olemassa myös toimintomalli, jossa saadaan ilmoitus käynnistävälle koodille säikeen päättymisestä. Muutoin on vaihtoehtona kysyä pollaamalla säikeen tilaa tai 'liittyä' säikeeseen join()-metodilla. Näissä pitää huolehtia mahdollisesta poikkeuksesta. Metodi sleep() aiheuttaa säikeen siirtymisen pois suorituksesta parametrina olevan millisekuntimäärän ajaksi. Pollaavassa versiossa kannattaa odottaa tovi ennen kuin kysyy uudelleen säikeen tilaa isAlive()-metodilla. Pollaus tarkoittaa sitä, että kysytään (poll) säikeen tilaa, koodissa siis aktiivisesti seurataan säikeen suorituksen tilaa.
99
99
100
100
```java
101
101
while (t3.isAlive()) { // join() on parempi!
@@ -106,7 +106,7 @@ while (t3.isAlive()) { // join() on parempi!
106
106
}
107
107
System.out.println("Säie 3 päättynyt");
108
108
try {
109
-
t2.join();
109
+
t2.join();// tämä on oikea tapa, ei kuluta resursseja
110
110
} catch (InterruptedException e) {
111
111
}
112
112
System.out.println("Säie 2 päättynyt");
@@ -167,7 +167,8 @@ Todellisuudessa tämä koodi toimii vain vahingossa oikein. Jos lisätään kier
167
167
168
168
Olemme päätyneet tilanteeseen, josta käytetään termiä Critical Section (kriittinen alue). Critical section on koodia, joka pitää suorittaa säikeessä atomaarisesti niin, ettei muut säikeet pääse suorittamaan samaa koodia tai käsittelemään samaa muuttujaa. Javassa tähän on ollut yksinkertainen ratkaisu olemassa jo aivan ensimmäisestä versiosta saakka ja se on synchronized sanalla toteutettavissa. Synchronized-toiminnolla saadaan lukittua koodilohko tai kokonainen metodi niin, että säie saa suorittaa metodin tai koodilohkon loppuun saakka ilman että mikään muu säie pääsee suorittamaan samaa koodia.
169
169
170
-
Koodilohkoa käytettäessä tarvitaan jokin olio lukitukseen. Jokaisessa Java-oliossa on sisäänrakennettu lukko-bitti, joka ei näy mitenkään, vaan se pitää tietää.
170
+
Koodilohkoa käytettäessä tarvitaan jokin olio lukitukseen. Jokaisessa Java-oliossa on sisäänrakennettu lukko-bitti, joka ei näy mitenkään, vaan se pitää tietää. Kriittisen alueen toteutukseen käytetään Mutex-tyyppistä lukitusta (Mutual exclusion) josta syystä esimerkissä lukitukseen käytettävän muuttujan nimi on *mutex*.
171
+
171
172
Turvallinen ja toimiva nextID()-metodin toteutus voi olla seuraava:
0 commit comments