Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Wątki, programowanie współbieżne
Krystian Ignasiak
2
Zalety programowania współbieżnego
odpowiadanie na zdarzenia dostępność usług łatwość sterowania jeden obiekt – jeden wątek przetwarzanie równoległe
3
Wady programowania współbieżnego
problem bezpieczeństwa programu (safety) możliwość wystąpienia zakleszczenia i innych sytuacji wpływających na żywotość programów (liveness) zachowania niedeterministyczne wymagania dodatkowej mocy obliczeniowej do tworzenia wątków i przełączania między wątkami w środowiskach jednoprocesorowych; wymagania dodatkowej mocy obliczeniowej na synchronizację wątków;
4
Co to jest wątek (thread) ?
Zestaw trzech elementów: Procesor Pamięć programu (program, kod) Pamięć danych (dane)
5
Wątki w Javie public class ThreadTester { public static void main(String args[]) { HelloRunner r = new HelloRunner(); Thread t = new Thread(r); t.start(); } } class HelloRunner implements Runnable { int i; public void run() { i = 0; while (true) { System.out.println(”Hello ” + i++); if (i == 50) { break; } } } }
6
Tworzenie wątków
7
Uruchamianie wątku th.start()
Wywołanie metody start powoduje przejscie wątku do stanu uruchomiony Wywołanie start nie musi oznaczać, że sterowanie natychmiast znajdzie się w metodzie run tego wątku
8
Kolejkowanie wątków Kolejkowanie zwykle bazuje na priorytetach (jednak nie ma gwarancji, ze konkretna implementacja w ogóle używa priorytetów) th.getPriority(), th.setPriority() Priorytet – liczba w zakresie 1-10 Thread.MIN_PRIORITY, Thread.MAX_PRIORITY, Thread.NORM_PRIORITY Java zwykle kolejkuje wątki metodą z wywłaszczaniem procesora (preemptive) Niektóre implementacje stosują metodę z podziałem czasu (timeslicing)
9
Zakończenie działania wątku
public class Runner implements Runnable { private boolean timeToQuit=false; public void run() { while ( ! timeToQuit ) { } // ustaw obiekt wątku w odpowiednim stanie } public void stopRunning() { timeToQuit=true; } } public class ThreadController { private Runner r = new Runner(); private Thread t = new Thread(r); public void startThread() { t.start(); } public void stopThread() { r.stopRunning(); } }
10
Sterowanie wątkami isAlive() Thread.sleep() join() Thread.yield()
11
Dwa sposoby tworzenia wątku
Dziedziczenie po klasie Thread Mniej skomplikowany kod Implementowanie Runnable Łatwiejsze projektowanie obiektowe Omijamy ograniczenie pojedynczego dziedziczenia Spójność z modelem (procesor, kod, dane)
12
Stany wątków, 1/2
13
Stany wątków, 2/2
14
Synchronizacja, 1/2 Dwa wątki (lub więcej) korzystają w tym samym czasie z danych jednego obiektu – może powstać konflikt (read-write, write-write) Gwarantuje się, że prymitywne operacje (dostęp do zmiennej typu prostego, oprócz typów long i double) będą wykonane w całości bez konieczności jawnego synchronizowania) Kompilator może dokonywać optymalizacji dostępu do danych (volatile);
15
Synchronizacja, 2/2 Bloki synchronizowane synchronized (myObject) { ... } Bloki synchronizowane są wykonywane w całości (chyba, że wait()...) Metoda synchronizowana może wywołać inną synchronizowaną na rzecz tego samego obiektu bez blokowania Słowo kluczowe synchronized może być przedefiniowane w klasach pochodnych Metody deklarowane w interfejsach nie mogą być synchronizowane
16
wait(), notify() Metody wait(), notify() mogą być wywołane tylko w ramach bloku synchronizowanego wait(): zatrzymanie aktualnego wątku interpreter umieszcza wątek w kolejce związanej z obiektem blokada synchronizacyjna jest zwalniana dla tego obiektu notify(): Zwalnia się blokadę synchronizacyjną dla obiektu (O) Jeśli istnieje wątek T (związany z obiektem O), żądający wykonania bloku synchronizowanego – uzyskuje monitor O i jest usuwany z kolejki wątków związanej z O T jest wznawiany za wywołaniem wait(), które spowodowało zatrzymanie
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.