Inspiracja , wiedza , realizacja
Jsystems

W przebudowie

Login



Java

Oracle

Linux

Android

PostgreSQL

Microsoft SQL Server

Egzekutory - pule wątków

Kamil Perczyński
Data dodania: Oct 30, 2015
Data aktualizacji: Oct 30, 2015

Programowanie aplikacji współbieżnych za pomocą kilku klas i metod nie jest zbyt wygodne, a w dodatku narażone na błędy które bardzo trudno jest znaleźć i poprawić. Dlatego w Javie 1.5 wprowadzono pakiet java.util.concurrent, który pozwala na korzystanie z bardziej abstrakcyjnych klas i metod, które bardzo ułatwiają rozwiązywanie wielowątkowych problemów.

ExecutorService - wstęp do pakietu java.util.concurrent

ExecutorService jest obiektem, który określa strategię pracy z wątkami. Będziemy mu przekazywać zadania, a już sam egzekutor zajmie się obsługą wątków. Co więcej, sam będzie zarządzał tworzeniem nowych wątków. To chyba jedna z jego największych zalet. Tworzenie wątków jest kosztowne, natomiast egzekutory potrafią wykonać recykling zużytych wątków.

Egzekutor tworzymy za pomocą statycznych metod z klasy Executors:

Egzekutor to tak naprawdę pula wątków. Ważne jest, aby wywołać na nim metodę shutdown() lub shutdownNow(). Jeśli tego nie zrobimy, główny wątek zostanie zablokowany.

Aby podać egzekutorowi zadanie, wywołujemy metodę submit( Runnable task )

Jest to zapis (w tym przypadku) analogiczny do stworzenia dwóch wątków i ich uruchomienia:

Rodzaje egzekutorów - ChachedThreadPool

W powyższym przykładzie użyliśmy CachedThreadPool czyli puli, która generalnie stara się używać już stworzonych wątków, ale jeśli potrzebuje nowych do uruchomienia wszystkich zadań do stworzy odpowiednią ilość nowych wątków. Po modyfikacji wypisania losowej daty do postaci:

Łatwo można zauważyć stworzenie nowych wątków:

Natomiast wykonując w Runnable'u pojedyncze wypisanie na ekran, ale przekazując task do puli 10 razy z drobnym opóźnieniem (mniej niż 1ms) zaobserwujemy wykorzystanie już istniejacych wątków:

FixedThreadPool pula z ogranizczeniem

Dość często chcemy ograniczyć ilość tworzonych wątków. CachedThreadPool potrafi stworzyć bardzo, bardzo dużo wątków, a to z kolei mnóstwo zasobów. Dlatego częściej korzysta się z FixedThreadPool, która pozwala programiście na podanie maksymalnej ilość stworzonych wątków:

SingleThreadExecutor egzektuor dla testów

Z klasy Executors możemy wyciągnąć też pojedynczy wątek - SingleThreadExecutor. Wszystkie taski przekazane do niego zostaną wykonane całkowicie synchronicznie. Stosuje się go, aby umożliwić przetestowanie oprogramowania. Kod wykonywany asynchronicznie jest niemal nietestowalny, ponieważ za każdym razem może zachować się inaczej.