Dzisiaj porozmawiamy sobie o działaniu na kilka frontów Czyli zobaczymy co to jest wątek i z czym to się je
W tym wpisie zajmiemy się głównie sposobami tworzenia wątków.
Czym zatem jest ten wątek?
Wątek jest niezależną ścieżką wykonania działającą w ramach procesu.
Czym zatem jest proces? Proces jest to egzemplarz wykonywanego programu.
Jak zatem widzimy wątek jest wykonywany w ramach procesu. W ramach jednego procesu może być wykonywanych wiele wątków.
Powinniśmy również wiedzieć, iż wątki dzielą zasoby pomiędzy sobą w ramach jednego procesu, natomiast każdy proces ma przydzielone swoje zasoby.
Wątki w Javie
W Javie wątki są reprezentowane przez klasę Thread.
Nowy wątek możemy utworzyć w Javie na 3 sposoby:
- Rozszerzając klasę Thread
- Implementując interfejs Runnable
- Implementując interfejs Callable
Czym się różnią te podejścia?
Rozszerzenie klasy Thread
Aby utworzyć wątek musimy rozszerzyć klasę Thread oraz nadpisać metodę run.
public class MyThread extends Thread { @Override public void run() { System.out.println("Jestem watkiem!"); } }W metodzie run umieszczamy nasz kod, który zostanie wykonany w naszym nowym wątku.
Implementacja interfejsu Runnable
Interfejs Runnable wymaga przez nas zaimplementowania jednej metody – run.
public class MyThread implements Runnable { @Override public void run() { System.out.println("Jestem watkiem!"); } }Podobnie jak w poprzednim przypadku kod, który ma być wykonany w wątku umieszczamy w metodzie run.
Implementacja interfejsu Callable
Interfejs Callable jest generyczny i dostarcza metodę call, która zwraca obiekt typu, którego użyliśmy przy implementacji Callable.
import java.util.concurrent.Callable; public class MyThread implements Callable<String> { @Override public String call() throws Exception { System.out.println("Jestem watkiem i cos zwroce!"); return "Zwracana wartosc :)"; } }Tym razem kod, który ma się wykonać w nowym wątku umieszczamy w metodzie call. Dodatkowo call wymuszą zwrócenie obiektu. Zwróćmy również uwagę, iż Callable deklaruje możliwość rzucenia wyjątku kontrolowanego (checked exception).
Co wybrać?
Poznaliśmy 3 sposoby tworzenia wątków w Javie, ale który powinniśmy używać?
Sposobu pierwszego, czyli rozszerzania klasy Thread będziemy prawdopodobnie używać najrzadziej. Musimy pamiętać, iż dziedziczenie powinno spełniać warunek IS-A, czyli klasa pochodna powinna być typem klasy nadrzędnej. Raczej rzadko będziemy spotykać się z sytuacją gdzie tworzona przez nas klasa będzie musiała rozszerzać Thread, aby rozszerzać jej funkcjonalność. Więcej o dziedziczeniu i kompozycji porozmawiamy w jednym z kolejnych wpisów.
Czyli pozostały nam dwie opcje Runnable i Callable. Tutaj powinniśmy dokonać wyboru mając na uwadze różnice pomiędzy tymi interfejsami:
- metoda run z interfejsu Runnable jest typu void, natomiast metoda call z Callable zwraca wynik obliczeń
- metoda call pozwala zadeklarować wyjątki kontrolowane (checked exceptions), czego nie pozwala metoda run.
Podsumowanie
Dzisiaj omówiliśmy sposoby tworzenia wątków w Javie. Powinniśmy zapamiętać, iż wątek możemy stworzyć na 3 sposoby:
- rozszerzając klasę Thread,
- implementując interfejs Runnable,
- implementując interfejs Callable.
W następnym wpisie związanym z wątkami omówimy sposoby na uruchomienie i zarządzanie naszymi wątkami.