Współbieżność w języku Java

Transkrypt

Współbieżność w języku Java
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Wojciech Rząsa
[email protected]
Katedra Informatyki i Automatyki, Politechnika Rzeszowska
16 kwietnia 2015
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
1/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Plan
1 Wstęp
2 Reprezentacja wątków w Javie
3 Zarządzanie wątkami
4 Podsumowanie
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
2/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Plan
1 Wstęp
2 Reprezentacja wątków w Javie
3 Zarządzanie wątkami
4 Podsumowanie
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
3/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Oparta na wątkach
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
4/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Oparta na wątkach
Prawdziwe wątki, które
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
4/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Oparta na wątkach
Prawdziwe wątki, które
mogą działać równolegle
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
4/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Oparta na wątkach
Prawdziwe wątki, które
mogą działać równolegle
mogą się wykonywać na różnych procesorach
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
4/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Oparta na wątkach
Prawdziwe wątki, które
mogą działać równolegle
mogą się wykonywać na różnych procesorach
nie są blokowane przez operacje IO innego wątku
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
4/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Oparta na wątkach
Prawdziwe wątki, które
mogą działać równolegle
mogą się wykonywać na różnych procesorach
nie są blokowane przez operacje IO innego wątku
Specyfika systemu operacyjnego
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
4/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Oparta na wątkach
Prawdziwe wątki, które
mogą działać równolegle
mogą się wykonywać na różnych procesorach
nie są blokowane przez operacje IO innego wątku
Specyfika systemu operacyjnego
Proste zarządzanie
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
4/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Oparta na wątkach
Prawdziwe wątki, które
mogą działać równolegle
mogą się wykonywać na różnych procesorach
nie są blokowane przez operacje IO innego wątku
Specyfika systemu operacyjnego
Proste zarządzanie
Prosta (?) komunikacja
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
4/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wątek
Niezależna ścieżka wykonywania danego programu
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
5/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wątek
Niezależna ścieżka wykonywania danego programu
Współdzielony kod programu
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
5/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wątek
Niezależna ścieżka wykonywania danego programu
Współdzielony kod programu
Współdzielony segment danych
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
5/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wątek
Niezależna ścieżka wykonywania danego programu
Współdzielony kod programu
Współdzielony segment danych
Oddzielny wskaźnik na aktualnie wykonywaną instrukcję
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
5/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wątek
Niezależna ścieżka wykonywania danego programu
Współdzielony kod programu
Współdzielony segment danych
Oddzielny wskaźnik na aktualnie wykonywaną instrukcję
Oddzielny stos wywołań metod
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
5/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wątek
Niezależna ścieżka wykonywania danego programu
Współdzielony kod programu
Współdzielony segment danych
Oddzielny wskaźnik na aktualnie wykonywaną instrukcję
Oddzielny stos wywołań metod
Oddzielna lista zmiennych lokalnych
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
5/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wątek
Niezależna ścieżka wykonywania danego programu
Współdzielony kod programu
Współdzielony segment danych
Oddzielny wskaźnik na aktualnie wykonywaną instrukcję
Oddzielny stos wywołań metod
Oddzielna lista zmiennych lokalnych
Lekkie, tanie, szybkie tworzenie
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
5/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wątek
Niezależna ścieżka wykonywania danego programu
Współdzielony kod programu
Współdzielony segment danych
Oddzielny wskaźnik na aktualnie wykonywaną instrukcję
Oddzielny stos wywołań metod
Oddzielna lista zmiennych lokalnych
Lekkie, tanie, szybkie tworzenie
Komunikacja bez dodatkowych mechanizmów (jak kolejki,
gniazda itp)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
5/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Program w Javie i wątki
Każdy program ma co najmniej jeden wątek użytkownika
(wątek główny)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
6/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Program w Javie i wątki
Każdy program ma co najmniej jeden wątek użytkownika
(wątek główny)
Dodatkowe wątki maszyny wirtualnej (garbage collector)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
6/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Program w Javie i wątki
Każdy program ma co najmniej jeden wątek użytkownika
(wątek główny)
Dodatkowe wątki maszyny wirtualnej (garbage collector)
Może dodatkowe wątki użytkownika
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
6/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Sposób wykonywania wątków
Równoległy (w tym samym czasie)
Z przeplotem/podziałem czasu
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
7/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wady wątków
Problem współdzielenia zmiennych
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
8/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wady wątków
Problem współdzielenia zmiennych
Problem synchronizacji
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
8/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Wady wątków
Problem współdzielenia zmiennych
Problem synchronizacji
Problem wykonania na wielu procesorach (w innych językach)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
8/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Plan
1 Wstęp
2 Reprezentacja wątków w Javie
3 Zarządzanie wątkami
4 Podsumowanie
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
9/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Reprezentacja wątku
Wątek jest obiektem
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
10/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Reprezentacja wątku
Wątek jest obiektem
Implementuje metodę run
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
10/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Reprezentacja wątku
Wątek jest obiektem
Implementuje metodę run
Dziedziczy po klasie Thread albo
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
10/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Reprezentacja wątku
Wątek jest obiektem
Implementuje metodę run
Dziedziczy po klasie Thread albo
Implementuje interfejs Runnable
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
10/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Reprezentacja wątku
Wątek jest obiektem
Implementuje metodę run
Dziedziczy po klasie Thread albo
Implementuje interfejs Runnable
Uruchamia się metodą start (nie run!)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
10/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Dziedziczenie po Thread
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Counter1 extends Thread {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
Counter1 c = new Counter1 ();
System . out . println ( " Counter created . " );
c . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wątek jako klasa dziedzicząca po Thread
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
11/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Dziedziczenie po Thread
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Counter created.
Counter started.
Main finished.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter finished.
class Counter1 extends Thread {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
Counter1 c = new Counter1 ();
System . out . println ( " Counter created . " );
c . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wątek jako klasa dziedzicząca po Thread
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
11/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Implementacja Runnable
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Counter2 implements Runnable {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
Counter2 c = new Counter2 ();
Thread t = new Thread ( c );
System . out . println ( " Counter created . " );
t . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wątek jako klasa implementująca Runnable
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
12/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Implementacja Runnable
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Counter created.
Counter started.
Main finished.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter finished.
class Counter2 implements Runnable {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
Counter2 c = new Counter2 ();
Thread t = new Thread ( c );
System . out . println ( " Counter created . " );
t . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wątek jako klasa implementująca Runnable
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
12/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
extends Thread, czy implements Runnable?
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
13/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
extends Thread, czy implements Runnable?
Jednokrotne dziedziczenie
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
13/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
extends Thread, czy implements Runnable?
Jednokrotne dziedziczenie
extends Thread daje łatwiejszy dostęp do metod
obsługujących wątek
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
13/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Plan
1 Wstęp
2 Reprezentacja wątków w Javie
3 Zarządzanie wątkami
sleep
join
interrupt
yield
Nazwy wątków
Priorytety
Daemony
Grupy wątków
Kończenie wątków
Współpraca i współzawodnictwo wątków
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
14/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Obiekt wątku
Wątki są obiektami
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
15/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Obiekt wątku
Wątki są obiektami
Zarządzanie poprzez wywoływanie na nich metod
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
15/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Obiekt wątku
Wątki są obiektami
Zarządzanie poprzez wywoływanie na nich metod
this w klasie, która dziedziczy po Thread
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
15/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Obiekt wątku
Wątki są obiektami
Zarządzanie poprzez wywoływanie na nich metod
this w klasie, która dziedziczy po Thread
W każdym miejscu: Thread.currentThread()
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
15/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Uśpienie wątku
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class CounterSleep extends Thread {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
try {
Thread . sleep (100); // 100 ms
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
System . out . println ( " Przerwano ! " );
}
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
CounterSleep c = new CounterSleep ();
System . out . println ( " Counter created . " );
c . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
16/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Uśpienie wątku
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Counter created.
Counter started.
Main finished.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter finished.
class CounterSleep extends Thread {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
try {
Thread . sleep (100); // 100 ms
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
System . out . println ( " Przerwano ! " );
}
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
CounterSleep c = new CounterSleep ();
System . out . println ( " Counter created . " );
c . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
16/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Uśpienie wątku (Runnable)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class CounterSleep2 implements Runnable {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
try {
Thread . currentThread (). sleep (100); // 100 ms
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
System . out . println ( " Przerwano ! " );
}
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
Thread t = new Thread ( new CounterSleep2 ());
System . out . println ( " Counter created . " );
t . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
17/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Uśpienie wątku (Runnable)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Counter created.
class CounterSleep2 implements Runnable {
Counter started.
public void run () {
Main finished.
for ( int i = 0; i < 10; i ++) {
Counter: 0
System . out . println ( " Counter : " + i );
Counter: 1
try {
Counter: 2
Thread . currentThread (). sleep (100); // 100 ms
Counter: 3
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
Counter: 4
System . out . println ( " Przerwano ! " );
Counter: 5
}
Counter: 6
}
Counter: 7
System . out . println ( " Counter finished . " );
Counter: 8
}
Counter: 9
Counter finished.
public static void main ( String [] args ) {
Thread t = new Thread ( new CounterSleep2 ());
System . out . println ( " Counter created . " );
t . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
17/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Uśpienie wątku
Czas: milisekundy
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
18/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Uśpienie wątku
Czas: milisekundy
Czas: milisekundy + nanosekundy
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
18/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Uśpienie wątku
Czas: milisekundy
Czas: milisekundy + nanosekundy
Problem z rozdzielczością zegara systemowego
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
18/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Uśpienie wątku
Czas: milisekundy
Czas: milisekundy + nanosekundy
Problem z rozdzielczością zegara systemowego
Uśpić można też wątek główny
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
18/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Oczekiwanie na zakończenie wątku
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Counter1 extends Thread {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
Counter1 c = new Counter1 ();
System . out . println ( " Counter created . " );
c . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wątek jako klasa dziedzicząca po Thread
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
19/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Oczekiwanie na zakończenie wątku
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Counter created.
Counter started.
Main finished.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter finished.
class Counter1 extends Thread {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
Counter1 c = new Counter1 ();
System . out . println ( " Counter created . " );
c . start ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wątek jako klasa dziedzicząca po Thread
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
19/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Oczekiwanie na zakończenie wątku – użycie join()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CounterJoin extends Thread {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
CounterJoin c = new CounterJoin ();
System . out . println ( " Counter created . " );
c . start ();
System . out . println ( " Counter started . " );
try {
c . join (); // mo ż na poda ć z timeoutem
System . out . println ( " Main finished . " );
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
System . out . println ( " Przerwano oczekiwanie ! " );
}
}
}
Współbieżność
w językuliczJava
Główny wątek oczekuje na zakończenie
wątku
Wojciech Rząsa, KIiA PRz
20/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Oczekiwanie na zakończenie wątku – użycie join()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Counter created.
Counter started.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter finished.
Main finished.
class CounterJoin extends Thread {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter : " + i );
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args ) {
CounterJoin c = new CounterJoin ();
System . out . println ( " Counter created . " );
c . start ();
System . out . println ( " Counter started . " );
try {
c . join (); // mo ż na poda ć z timeoutem
System . out . println ( " Main finished . " );
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
System . out . println ( " Przerwano oczekiwanie ! " );
}
}
}
Współbieżność
w językuliczJava
Główny wątek oczekuje na zakończenie
wątku
Wojciech Rząsa, KIiA PRz
20/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerwanie wątku (interrupt)
Wątek otrzymuje informację o przerwaniu
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
21/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerwanie wątku (interrupt)
Wątek otrzymuje informację o przerwaniu
Wątek może zareagować, albo zignorować informację
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
21/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerwanie wątku (interrupt)
Wątek otrzymuje informację o przerwaniu
Wątek może zareagować, albo zignorować informację
Metody blokujące wątek zgłaszają InterruptedException
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
21/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerwanie wątku (interrupt)
Wątek otrzymuje informację o przerwaniu
Wątek może zareagować, albo zignorować informację
Metody blokujące wątek zgłaszają InterruptedException
wait
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
21/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerwanie wątku (interrupt)
Wątek otrzymuje informację o przerwaniu
Wątek może zareagować, albo zignorować informację
Metody blokujące wątek zgłaszają InterruptedException
wait
join
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
21/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerwanie wątku (interrupt)
Wątek otrzymuje informację o przerwaniu
Wątek może zareagować, albo zignorować informację
Metody blokujące wątek zgłaszają InterruptedException
wait
join
sleep
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
21/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerwanie wątku (interrupt)
Wątek otrzymuje informację o przerwaniu
Wątek może zareagować, albo zignorować informację
Metody blokujące wątek zgłaszają InterruptedException
wait
join
sleep
Sposób na zakończenie wątku przed czasem
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
21/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Obsługa przerwania wątku
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class CounterInt1 extends Thread {
public void run () {
for ( int i = 0; i < 1000000; i ++) {
System . out . println ( " Counter : " + i );
if ( interrupted ()) break ;
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args )
throws I n t e r r u p t e d E x c e p t i o n {
CounterInt1 c = new CounterInt1 ();
System . out . println ( " Counter created . " );
c . start ();
Thread . sleep (1);
c . interrupt ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
22/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Obsługa przerwania wątku
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Counter created.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter started.
Main finished.
Counter finished.
class CounterInt1 extends Thread {
public void run () {
for ( int i = 0; i < 1000000; i ++) {
System . out . println ( " Counter : " + i );
if ( interrupted ()) break ;
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args )
throws I n t e r r u p t e d E x c e p t i o n {
CounterInt1 c = new CounterInt1 ();
System . out . println ( " Counter created . " );
c . start ();
Thread . sleep (1);
c . interrupt ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
22/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Obsługa przerwania wątku (Runnable)
1 class CounterInt2 implements Runnable {
2
public void run () {
3
for ( int i = 0; i < 1000000; i ++) {
4
System . out . println ( " Counter : " + i );
5
if ( Thread . currentThread (). interrupted ())
6
break ;
7
}
8
System . out . println ( " Counter finished . " );
9
}
10
11
public static void main ( String [] args )
12
throws I n t e r r u p t e d E x c e p t i o n {
13
CounterInt2 c = new CounterInt2 ();
14
Thread t = new Thread ( c );
15
System . out . println ( " Counter created . " );
16
17
t . start ();
18
Thread . sleep (1);
19
t . interrupt (); // na w ą tku !
20
System . out . println ( " Counter started . " );
21
22
System . out . println ( " Main finished . " );
23
}
24
} Rząsa, KIiA PRz
Wojciech
Współbieżność w języku Java
23/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Obsługa przerwania wątku (Runnable)
1 class CounterInt2 implements Runnable {
2
public void run () {
3
for ( int i = 0; i < 1000000; i ++) {
4
System . out . println ( " Counter : " + i );
5
if ( Thread . currentThread (). interrupted ())
6
break ;
7
}
8
System . out . println ( " Counter finished . " );
9
}
10
11
public static void main ( String [] args )
12
throws I n t e r r u p t e d E x c e p t i o n {
13
CounterInt2 c = new CounterInt2 ();
14
Thread t = new Thread ( c );
15
System . out . println ( " Counter created . " );
16
17
t . start ();
18
Thread . sleep (1);
19
t . interrupt (); // na w ą tku !
20
System . out . println ( " Counter started . " );
21
22
System . out . println ( " Main finished . " );
23
}
24
} Rząsa, KIiA PRz
Wojciech
Współbieżność w języku Java
Counter created.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter started.
Main finished.
Counter finished.
23/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerywanie wątku – uwagi
Metoda interrupt() ustawia flagę
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
24/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerywanie wątku – uwagi
Metoda interrupt() ustawia flagę
Metoda interrupted() sprawdza i czyści flagę
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
24/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerywanie wątku – uwagi
Metoda interrupt() ustawia flagę
Metoda interrupted() sprawdza i czyści flagę
Metoda isInterrupted() sprawdza nie czyści flagi!
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
24/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerywanie wątku – uwagi
Metoda interrupt() ustawia flagę
Metoda interrupted() sprawdza i czyści flagę
Metoda isInterrupted() sprawdza nie czyści flagi!
Wygenerowanie InterruptedException czyści flagę
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
24/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerywanie wątku – uwagi
Metoda interrupt() ustawia flagę
Metoda interrupted() sprawdza i czyści flagę
Metoda isInterrupted() sprawdza nie czyści flagi!
Wygenerowanie InterruptedException czyści flagę
Wątek musi sam wspierać możliwość przerwania przez
interrupt
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
24/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przerywanie wątku – uwagi
Metoda interrupt() ustawia flagę
Metoda interrupted() sprawdza i czyści flagę
Metoda isInterrupted() sprawdza nie czyści flagi!
Wygenerowanie InterruptedException czyści flagę
Wątek musi sam wspierać możliwość przerwania przez
interrupt
Obsługując wyjątek można na nowo ustawić flagę wywołując
(interrupt())
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
24/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przekazanie sterowania
Metoda yield
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
25/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przekazanie sterowania
Metoda yield
Wątek przekazuje sterowanie do innego wątku
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
25/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Przekazanie sterowania
Metoda yield
Wątek przekazuje sterowanie do innego wątku
Skutki mogą być różne... ;-)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
25/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Użycie yield
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class CounterYield extends Thread {
public void run () {
for ( int i = 0; i < 1000000; i ++) {
System . out . println ( " Counter : " + i );
if ( interrupted ()) break ;
if ( i % 2 == 0) yield ();
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args )
throws I n t e r r u p t e d E x c e p t i o n {
CounterYield c = new CounterYield ();
System . out . println ( " Counter created . " );
c . start ();
Thread . sleep (1);
c . interrupt ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
26/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Użycie yield
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Counter created.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter started.
Counter finished.
Main finished.
class CounterYield extends Thread {
public void run () {
for ( int i = 0; i < 1000000; i ++) {
System . out . println ( " Counter : " + i );
if ( interrupted ()) break ;
if ( i % 2 == 0) yield ();
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args )
throws I n t e r r u p t e d E x c e p t i o n {
CounterYield c = new CounterYield ();
System . out . println ( " Counter created . " );
c . start ();
Thread . sleep (1);
c . interrupt ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
26/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Użycie yield
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Counter created.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter: 10
Counter: 11
Counter: 12
Counter started.
Counter finished.
Main finished.
class CounterYield extends Thread {
public void run () {
for ( int i = 0; i < 1000000; i ++) {
System . out . println ( " Counter : " + i );
if ( interrupted ()) break ;
if ( i % 2 == 0) yield ();
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args )
throws I n t e r r u p t e d E x c e p t i o n {
CounterYield c = new CounterYield ();
System . out . println ( " Counter created . " );
c . start ();
Thread . sleep (1);
c . interrupt ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
26/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Użycie yield
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class CounterYield extends Thread {
public void run () {
for ( int i = 0; i < 1000000; i ++) {
System . out . println ( " Counter : " + i );
if ( interrupted ()) break ;
if ( i % 2 == 0) yield ();
}
System . out . println ( " Counter finished . " );
}
public static void main ( String [] args )
throws I n t e r r u p t e d E x c e p t i o n {
CounterYield c = new CounterYield ();
System . out . println ( " Counter created . " );
c . start ();
Thread . sleep (1);
c . interrupt ();
System . out . println ( " Counter started . " );
System . out . println ( " Main finished . " );
}
}
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
Counter created.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter: 10
Counter: 11
Counter: 12
Counter: 13
Counter: 14
Counter: 15
Counter: 16
Counter: 17
Counter: 18
Counter: 19
Counter: 20
Counter: 21
Counter: 22
26/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
yield
Nie zapewnia determinizmu
Nie wymusza uruchomienia innego wątku
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
27/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Nazwy wątków
Wątki mogą mieć nazwy
Istotne przy debugowaniu
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
28/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Nazwy wątków
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class NamedCounter extends Thread {
public NamedCounter ( String name )
{ super ( name ); }
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter " + getName ()+ " : " + i );
}
System . out . println ( " Counter " + getName ()+ " finished . " );
}
public static void main ( String [] args ) {
NamedCounter c1 = new NamedCounter ( " Licznik 1 " );
NamedCounter c2 = new NamedCounter ( " Licznik 2 " );
c1 . start ();
c2 . start ();
}
}
Counter
Licznik
Wojciech
Rząsa, KIiA
PRz
Wątek z nazwą
2: 0
Współbieżność w języku Java
29/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Nazwy wątków – wyjście
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Wojciech Rząsa, KIiA PRz
2: 0
1: 0
2: 1
1: 1
2: 2
1: 2
2: 3
1: 3
2: 4
1: 4
2: 5
1: 5
2: 6
1: 6
2: 7
1: 7
2: 8
1: 8
2: 9
1: 9
2 finished.
1 finished.
Współbieżność w języku Java
30/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Nazwy wątków – wyjście
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Wojciech Rząsa, KIiA PRz
2: 0
1: 0
2: 1
1: 1
2: 2
1: 2
2: 3
1: 3
2: 4
1: 4
2: 5
1: 5
2: 6
1: 6
2: 7
1: 7
2: 8
1: 8
2: 9
1: 9
2 finished.
1 finished.
sleep join interrupt yield Nazwy Priorytety Daemony
Tutaj wątki się dokładnie
przeplatają
Nie musi tak być. . .
Współbieżność w języku Java
30/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Nazwy wątków – wyjście
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Wojciech Rząsa, KIiA PRz
2: 0
1: 0
2: 1
1: 1
2: 2
1: 2
2: 3
1: 3
2: 4
1: 4
2: 5
1: 5
2: 6
1: 6
2: 7
1: 7
2: 8
1: 8
2: 9
1: 9
2 finished.
1 finished.
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Counter
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
Licznik
1: 0
1: 1
1: 2
1: 3
1: 4
1: 5
1: 6
1: 7
1: 8
2: 0
1: 9
2: 1
1 finished.
2: 2
2: 3
2: 4
2: 5
2: 6
2: 7
2: 8
2: 9
2 finished.
Współbieżność w języku Java
30/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Nazwy wątków – Runnable
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class NamedCounter2 implements Runnable {
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( " Counter " +
Thread . currentThread (). getName ()+ " : " + i );
}
System . out . println ( " Counter " +
Thread . currentThread (). getName ()+ " finished . " );
}
public static void main ( String [] args ) {
Thread t1 =
new Thread ( new NamedCounter2 () , " Licznik 1 " );
Thread t2 =
new Thread ( new NamedCounter2 () , " Licznik 2 " );
t1 . start ();
t2 . start ();
}
}
Wojciech Rząsa, KIiA PRz
Wątek z nazwą,
Runnable
Współbieżność w języku Java
31/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Priorytety wątków
Można ustawiać piorytety dla wątków
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
32/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Priorytety wątków
Można ustawiać piorytety dla wątków
Pomiędzy Thread.MIN PRIORITY a Thread.MAX PRIORITY
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
32/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Priorytety wątków
Można ustawiać piorytety dla wątków
Pomiędzy Thread.MIN PRIORITY a Thread.MAX PRIORITY
Domyślnie taki jak wątek tworzący, domyślnie
Thread.NORM PRIORITY
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
32/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Priorytety wątków
Można ustawiać piorytety dla wątków
Pomiędzy Thread.MIN PRIORITY a Thread.MAX PRIORITY
Domyślnie taki jak wątek tworzący, domyślnie
Thread.NORM PRIORITY
Metoda setPriority(priorytet)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
32/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Priorytety wątków
Można ustawiać piorytety dla wątków
Pomiędzy Thread.MIN PRIORITY a Thread.MAX PRIORITY
Domyślnie taki jak wątek tworzący, domyślnie
Thread.NORM PRIORITY
Metoda setPriority(priorytet)
Aktualnie:
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
32/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Priorytety wątków
Można ustawiać piorytety dla wątków
Pomiędzy Thread.MIN PRIORITY a Thread.MAX PRIORITY
Domyślnie taki jak wątek tworzący, domyślnie
Thread.NORM PRIORITY
Metoda setPriority(priorytet)
Aktualnie:
MIN PRIORITY 1
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
32/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Priorytety wątków
Można ustawiać piorytety dla wątków
Pomiędzy Thread.MIN PRIORITY a Thread.MAX PRIORITY
Domyślnie taki jak wątek tworzący, domyślnie
Thread.NORM PRIORITY
Metoda setPriority(priorytet)
Aktualnie:
MIN PRIORITY 1
NORM PRIORITY 5
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
32/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Priorytety wątków
Można ustawiać piorytety dla wątków
Pomiędzy Thread.MIN PRIORITY a Thread.MAX PRIORITY
Domyślnie taki jak wątek tworzący, domyślnie
Thread.NORM PRIORITY
Metoda setPriority(priorytet)
Aktualnie:
MIN PRIORITY 1
NORM PRIORITY 5
MAX PRIORITY 10
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
32/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Counter created.
Counter started.
Main finished.
Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6
Counter: 7
Counter: 8
Counter: 9
Counter finished.
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Takie wątki to daemony
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Takie wątki to daemony
działają w tle
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Takie wątki to daemony
działają w tle
są potrzebne innym wątkom (rola usługowa)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Takie wątki to daemony
działają w tle
są potrzebne innym wątkom (rola usługowa)
nie są potrzebne, gdy nie ma innych wątków
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Takie wątki to daemony
działają w tle
są potrzebne innym wątkom (rola usługowa)
nie są potrzebne, gdy nie ma innych wątków
Np. producent – konsument
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Takie wątki to daemony
działają w tle
są potrzebne innym wątkom (rola usługowa)
nie są potrzebne, gdy nie ma innych wątków
Np. producent – konsument
Każdy wątek można ustawić jako daemon
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Takie wątki to daemony
działają w tle
są potrzebne innym wątkom (rola usługowa)
nie są potrzebne, gdy nie ma innych wątków
Np. producent – konsument
Każdy wątek można ustawić jako daemon
Wywołanie setDaemon(true) na obiekcie wątku. . .
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Daemony
Aplikacja kończy się gdy zakończą sie wszystkie wątki
użytkownika
Czasami niektóre wątki nie powinny blokować zakończenia
aplikacji
Takie wątki to daemony
działają w tle
są potrzebne innym wątkom (rola usługowa)
nie są potrzebne, gdy nie ma innych wątków
Np. producent – konsument
Każdy wątek można ustawić jako daemon
Wywołanie setDaemon(true) na obiekcie wątku. . .
. . . zanim wątek zostanie wystartowany
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
33/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Wątek Ticker – deamon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Ticker extends Thread {
private long time ;
public Ticker ( long time ) {
super ( " Ticker " + time );
this . time = time ;
setDaemon ( true );
}
public void run () {
try {
while ( true ) {
sleep ( time );
System . out . println ( " == ======= ====< tick >========== " );
}
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
System . out . println ( " Ticker interruped ! " );
}
System . out . println ( " Ticker finished ! " );
}
}
Wojciech Rząsa, KIiA PRz
Wątek daemona
Współbieżność w języku Java
34/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Wątek LongCounter
1
2
3
4
5
6
7
8
9
10
class LongCounter extends Thread {
public void run () {
for ( int i = 0; i < 70000000; i ++) {
if ( i % 10000000 == 0) {
System . out . println ( " Counter : " + i );
}
}
System . out . println ( " Counter finished . " );
}
}
Wątek licznika
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
35/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Wątek główny
1
2
3
4
5
6
7
8
9
10
11
public class TickerDemo {
public static void main ( String [] args ) {
Ticker ticker = new Ticker (10);
LongCounter counter = new LongCounter ();
ticker . start ();
counter . start ();
System . out . println ( " Main thread finished . " );
}
}
Wątek główny
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
36/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Wyjście
Main thread finished.
Counter: 0
=============< tick >==========
=============< tick >==========
Counter: 10000000
=============< tick >==========
Counter: 20000000
=============< tick >==========
=============< tick >==========
Counter: 30000000
=============< tick >==========
Counter: 40000000
=============< tick >==========
=============< tick >==========
Counter: 50000000
=============< tick >==========
Counter: 60000000
=============< tick >==========
=============< tick >==========
Counter finished.
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
37/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Wyjście
Main thread finished.
Counter: 0
=============< tick >==========
=============< tick >==========
Counter: 10000000
=============< tick >==========
Counter: 20000000
=============< tick >==========
=============< tick >==========
Counter: 30000000
=============< tick >==========
Counter: 40000000
=============< tick >==========
=============< tick >==========
Counter: 50000000
=============< tick >==========
Counter: 60000000
=============< tick >==========
=============< tick >==========
Counter finished.
Wojciech Rząsa, KIiA PRz
Wątek główny zakończył się
niemal natychmiast
Współbieżność w języku Java
37/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Wyjście
Main thread finished.
Counter: 0
=============< tick >==========
=============< tick >==========
Counter: 10000000
=============< tick >==========
Counter: 20000000
=============< tick >==========
=============< tick >==========
Counter: 30000000
=============< tick >==========
Counter: 40000000
=============< tick >==========
=============< tick >==========
Counter: 50000000
=============< tick >==========
Counter: 60000000
=============< tick >==========
=============< tick >==========
Counter finished.
Wojciech Rząsa, KIiA PRz
Wątek główny zakończył się
niemal natychmiast
Wątek LongCounter zakończył
się poprawnie
Współbieżność w języku Java
37/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Wyjście
Main thread finished.
Counter: 0
=============< tick >==========
=============< tick >==========
Counter: 10000000
=============< tick >==========
Counter: 20000000
=============< tick >==========
=============< tick >==========
Counter: 30000000
=============< tick >==========
Counter: 40000000
=============< tick >==========
=============< tick >==========
Counter: 50000000
=============< tick >==========
Counter: 60000000
=============< tick >==========
=============< tick >==========
Counter finished.
Wojciech Rząsa, KIiA PRz
Wątek główny zakończył się
niemal natychmiast
Wątek LongCounter zakończył
się poprawnie
Program zakończył się pomimo
nieskończonej pętli wątku
Ticker
Współbieżność w języku Java
37/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Grupy wątków
Wątki można łączyć w grupy (ThreadGroup)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
38/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Grupy wątków
Wątki można łączyć w grupy (ThreadGroup)
Grupa może zawierać wątki oraz grupy wątków (drzewo)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
38/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Grupy wątków
Wątki można łączyć w grupy (ThreadGroup)
Grupa może zawierać wątki oraz grupy wątków (drzewo)
Wątek może sprawdzić do jakiej grupy należy
(getThreadGroup)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
38/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Grupy wątków
Wątki można łączyć w grupy (ThreadGroup)
Grupa może zawierać wątki oraz grupy wątków (drzewo)
Wątek może sprawdzić do jakiej grupy należy
(getThreadGroup)
Wątek może wylistować wątki ze swojej grupy (enumerate)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
38/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Grupy wątków
Wątki można łączyć w grupy (ThreadGroup)
Grupa może zawierać wątki oraz grupy wątków (drzewo)
Wątek może sprawdzić do jakiej grupy należy
(getThreadGroup)
Wątek może wylistować wątki ze swojej grupy (enumerate)
Można ustawić grupę jako deamon (setDaemon) (zostanie
automatycznie usunięta)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
38/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Grupy wątków
Wątki można łączyć w grupy (ThreadGroup)
Grupa może zawierać wątki oraz grupy wątków (drzewo)
Wątek może sprawdzić do jakiej grupy należy
(getThreadGroup)
Wątek może wylistować wątki ze swojej grupy (enumerate)
Można ustawić grupę jako deamon (setDaemon) (zostanie
automatycznie usunięta)
Można wykonywać interrupt na całej grupie wątków
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
38/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Grupy wątków
Wątki można łączyć w grupy (ThreadGroup)
Grupa może zawierać wątki oraz grupy wątków (drzewo)
Wątek może sprawdzić do jakiej grupy należy
(getThreadGroup)
Wątek może wylistować wątki ze swojej grupy (enumerate)
Można ustawić grupę jako deamon (setDaemon) (zostanie
automatycznie usunięta)
Można wykonywać interrupt na całej grupie wątków
Można ograniczać priorytet dla całej grupy wątków
(setMaxPriority)
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
38/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
destroy never implemented, deadlock-prone
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
destroy never implemented, deadlock-prone
stop deprecated, unsafe
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
destroy never implemented, deadlock-prone
stop deprecated, unsafe
suspend deprecated, deadlock-prone
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
destroy never implemented, deadlock-prone
stop deprecated, unsafe
suspend deprecated, deadlock-prone
resume deprecated
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
destroy never implemented, deadlock-prone
stop deprecated, unsafe
suspend deprecated, deadlock-prone
resume deprecated
Wątek musi się zakończyć, albo
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
destroy never implemented, deadlock-prone
stop deprecated, unsafe
suspend deprecated, deadlock-prone
resume deprecated
Wątek musi się zakończyć, albo
Wątek musi obsługiwać przerwanie, albo
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
destroy never implemented, deadlock-prone
stop deprecated, unsafe
suspend deprecated, deadlock-prone
resume deprecated
Wątek musi się zakończyć, albo
Wątek musi obsługiwać przerwanie, albo
Wątek musi być daemonem
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Kończenie wątków
Wątku nie da się „zabić”
Problemy synchronizacji
destroy never implemented, deadlock-prone
stop deprecated, unsafe
suspend deprecated, deadlock-prone
resume deprecated
Wątek musi się zakończyć, albo
Wątek musi obsługiwać przerwanie, albo
Wątek musi być daemonem
Program w Javie oczywiście można „zabić”
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
39/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Współpraca i współzawodnictwo wątków
Czy wątki współzawodniczą?
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
40/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Współpraca i współzawodnictwo wątków
Czy wątki współzawodniczą?
tak, w dostępie do zasobów
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
40/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Współpraca i współzawodnictwo wątków
Czy wątki współzawodniczą?
tak, w dostępie do zasobów
Wątki mogą współpracować
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
40/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Współpraca i współzawodnictwo wątków
Czy wątki współzawodniczą?
tak, w dostępie do zasobów
Wątki mogą współpracować
w rozwiązywaniu problemów
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
40/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Współpraca i współzawodnictwo wątków
Czy wątki współzawodniczą?
tak, w dostępie do zasobów
Wątki mogą współpracować
w rozwiązywaniu problemów
Współpraca wymaga komunikacji
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
40/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Komunikacja pomiędzy wątkami
Wątki współdzielą zmienne
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
41/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Komunikacja pomiędzy wątkami
Wątki współdzielą zmienne
globalne
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
41/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Komunikacja pomiędzy wątkami
Wątki współdzielą zmienne
globalne
pola statyczne
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
41/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Komunikacja pomiędzy wątkami
Wątki współdzielą zmienne
globalne
pola statyczne
Współdzielą obiekty do których posiadają referencje
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
41/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Komunikacja pomiędzy wątkami
Wątki współdzielą zmienne
globalne
pola statyczne
Współdzielą obiekty do których posiadają referencje
Wspólne zmienne umożliwiają szybkie przekazywanie danych
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
41/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument
Producent – jeden wątek
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
42/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument
Producent – jeden wątek
Konsument – drugi wątek
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
42/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej zmiennej
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
42/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej zmiennej
Konsument odczytuje ze współdzielonej zmiennej
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
42/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej zmiennej
Konsument odczytuje ze współdzielonej zmiennej
Wątki wykonują się z różną szybkością, w różnych momentach
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
42/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej zmiennej
Konsument odczytuje ze współdzielonej zmiennej
Wątki wykonują się z różną szybkością, w różnych momentach
Producent: czy można już zapisać?
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
42/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej zmiennej
Konsument odczytuje ze współdzielonej zmiennej
Wątki wykonują się z różną szybkością, w różnych momentach
Producent: czy można już zapisać?
Konsument: czy można już odczytać?
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
42/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Sprawdzenie czy tablica nie jest pełna
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Sprawdzenie czy tablica nie jest pełna
Zapisanie nowej danej
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Sprawdzenie czy tablica nie jest pełna
Zapisanie nowej danej
Przesunięcie indeksu tablicy
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Sprawdzenie czy tablica nie jest pełna
Zapisanie nowej danej
Przesunięcie indeksu tablicy
Konsument odczytuje ze współdzielonej tablicy
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Sprawdzenie czy tablica nie jest pełna
Zapisanie nowej danej
Przesunięcie indeksu tablicy
Konsument odczytuje ze współdzielonej tablicy
Sprawdzenie, czy tablica nie jest pusta
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Sprawdzenie czy tablica nie jest pełna
Zapisanie nowej danej
Przesunięcie indeksu tablicy
Konsument odczytuje ze współdzielonej tablicy
Sprawdzenie, czy tablica nie jest pusta
Odczytanie nowej danej
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Sprawdzenie czy tablica nie jest pełna
Zapisanie nowej danej
Przesunięcie indeksu tablicy
Konsument odczytuje ze współdzielonej tablicy
Sprawdzenie, czy tablica nie jest pusta
Odczytanie nowej danej
Przesunięcie indeksu tablicy
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Producent – konsument, dłuższy bufor
Producent – jeden wątek
Konsument – drugi wątek
Producent zapisuje coś do współdzielonej tablicy
Sprawdzenie czy tablica nie jest pełna
Zapisanie nowej danej
Przesunięcie indeksu tablicy
Konsument odczytuje ze współdzielonej tablicy
Sprawdzenie, czy tablica nie jest pusta
Odczytanie nowej danej
Przesunięcie indeksu tablicy
Wątki mogą się przeplatać w dowolnych momentach!
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
43/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Synchronizacja
Operacje na wspólnych danych wymagają synchronizacji
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
44/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Synchronizacja
Operacje na wspólnych danych wymagają synchronizacji
Konieczne definiowanie operacji niepodzielnych
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
44/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Synchronizacja
Operacje na wspólnych danych wymagają synchronizacji
Konieczne definiowanie operacji niepodzielnych
Oczekiwanie na zmianę
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
44/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Synchronizacja
Operacje na wspólnych danych wymagają synchronizacji
Konieczne definiowanie operacji niepodzielnych
Oczekiwanie na zmianę
Powiadamianie o zmianach
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
44/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
45/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wbudowane w język – pewne, bezpieczne
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
45/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
sleep join interrupt yield Nazwy Priorytety Daemony
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wbudowane w język – pewne, bezpieczne
Wygodne
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
45/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Plan
1 Wstęp
2 Reprezentacja wątków w Javie
3 Zarządzanie wątkami
4 Podsumowanie
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
46/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wbudowana w język
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wbudowana w język
Efektywna
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wbudowana w język
Efektywna
Reprezentacja przy pomocy obiektów
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wbudowana w język
Efektywna
Reprezentacja przy pomocy obiektów
Metody do zarządzania wątkami
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wbudowana w język
Efektywna
Reprezentacja przy pomocy obiektów
Metody do zarządzania wątkami
Prawdziwe, równolegle działające wątki
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wbudowana w język
Efektywna
Reprezentacja przy pomocy obiektów
Metody do zarządzania wątkami
Prawdziwe, równolegle działające wątki
Zachowanie wątków zależy od systemu operacyjnego
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wbudowana w język
Efektywna
Reprezentacja przy pomocy obiektów
Metody do zarządzania wątkami
Prawdziwe, równolegle działające wątki
Zachowanie wątków zależy od systemu operacyjnego
Brak determinizmu
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47
Wstęp Wątki w Javie Zarządzanie wątkami Podsumowanie
Współbieżność w języku Java
Najczęściej realizowana za pomocą wątków
Wbudowana w język
Efektywna
Reprezentacja przy pomocy obiektów
Metody do zarządzania wątkami
Prawdziwe, równolegle działające wątki
Zachowanie wątków zależy od systemu operacyjnego
Brak determinizmu
Konieczna synchronizacja
Wojciech Rząsa, KIiA PRz
Współbieżność w języku Java
47/47