Współbieżność w Javie
Laboratorium 1
Wątki
- Wątek a proces
- Kernel threads, user threads i Leightweight Processes LWP. Mieszany model systemu Solaris
- standard POSIX threads
Wątki w języku Java
- Wbudowane w język
- Dwa rodzaje implementacji
- Przez dziedziczenie z klasy Thread
Klasa:
class MyThread extends Thread {
. . .
public void run() {
. . .
}
}
Tworzenie obiektu i uruchamianie wątku:
MyThread t = new MyThread();
t.start();
- Przez implementację interfejsu Runnable
Klasa:
class MyThreadR implements Runnable {
. . .
public void run() {
. . .
}
}
Tworzenie i uruchamianie:
MyThreadR r = new MyThreadR();
Thread t = new Thread(r);
t.start();
- Metoda run()
public void run() {
// kod wątku
}
- Klasa Thread
klasy
- Niektore wazne metody
void setName(String name)
String getName()
void setPriority(int newPriority)
int getPriority()
void join()
static void sleep(long milis, int nanos)
public static Thread currentThread()
String toString()
Wątki w JVM
- Architektura JVM
- Obszary pamięci:
- Dzielone pomiedzy watki
- Prywatne dla kazdego watku
- Cykl życia wątku, stany wątku
- Szeregowanie wątkow w Javie
- Ogólne pojęcia szeregowania: wywłaszczania (preemption),
podziału czasu (time-slicing, time-sharing), priorytety.
- Dokładne zachowanie się wątków jest zależne od platformy.
- Wątki mogą być zaimplementowane całkowicie w przestrzeni
użytkownika lub korzystać z natywnych interfejsów platformy.
- Wątkom można przypisać priorytety (1-10). Jedyną gwarancją jest
to, że wątkom o najwyższym priorytecie zostanie przydzielony CPU.
Wątki o niższym priorytecie mają gwarancję przydziału CPU tylko
wtedy, gdy wątki z wyższym priorytetem są zablokowane, w przeciwnym
wypadku nie ma tej gwarancji.
- Specyfikacja nie zakłada podziału czasu.
- Operacje odczytu i zapisu danych typów prostych (primitives)
pomiędzy pamięcią główną a roboczą pamięcią wątku są atomowe.
Jedynym wyjątkiem mogą być operacje na 64-bitowych typach long
i double, które mogą być zrealizowane jako dwie operacje 32-bitowe.
- Reguly szeregowania
- W każdym momencie, spośród kilku wątkow w stanie RUNNABLE
wybierany jest ten o najwyższym priorytecie
- Wykonywany wątek może być wywłaszczony, jeśli pojawi się
wątek o wyższym priorytecie, gotowy do wykonania
- Jeśli wiele wątków ma ten sam priorytet, wybierany jest
jeden z nich, wg kolejności (round-robin)
- Na niektórych systemach może być zaimplementowany podział
czasu (wątki sa wywłaszczane po upływie kwantu czasu)
Wyścig
- Więcej niż jeden wątek korzysta jednocześnie z zasobu dzielonego, przy
czym co najmniej jeden próbuje go zmienić
- Przyczyna niedeterministycznego zachowania się programu
- Może prowadzić do trudnych do wykrycia błędów
- Pojęcie thread-safety (bezpieczeństwo dla wątków, wielobieżność)
Ćwiczenie
Temat podany na zajęciach.
Pobierz szkielet programu. Pobierz rozwiazanie.
Zadanie
Przeczytać rozdział 20
Thread Synchronization z książki Inside the Java Virtual
Machine
Bibliografia
- Jacek Rumiński, Język Java. Rozdział o wątkach
- Bill Venners, Inside the Java Virtual Machine (rozdz. 5, The Java Virtual Machine), McGraw-Hill Companies; 2nd Bk&Cdr edition, 2000.
Bartosz Baliś, balis at agh.edu.pl
|