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