Jako inżynier backendu mamy do czynienia z sytuacjami, w których dane są przetwarzane asynchronicznie. Dzisiaj zobaczmy, jak to się robi w javie i na różne sposoby.

Thread

Bardzo podstawowym, ale tak potężnym komponentem współbieżności Java jest Thread. Wątek Javy jest w rzeczywistości powiązany z wątkiem systemu operacyjnego. Bardzo podstawowy sposób na stworzenie Thread jest rozszerzenie go i zastąpienie run :

Rozpoczęcie wątku powoduje, że run() być nazywanym.
Możesz zapytać; tak, Thread ma mnóstwo innych metod, które można obejść:

  • W większości przypadków nie chcemy przesłaniać innych metod wątku.
  • Gdy przedłużymy Thread klasa rozszerzająca traci zdolność do dalszego rozszerzania, ponieważ Java nie obsługuje wielu dziedziczeń.
  • Każdy wątek ma swój własny obiekt, gdy go rozszerzamy, i nie jest dobry dla zdrowia pamięci, gdy jest mnóstwo Objects of the extended Thread Utworzony.

Java rozwiązuje te problemy za pomocą interfejsu Runnable. Faktycznie, Thread ma przeciążoną metodę, która pobiera Runnable.

Runnable

Runnable to interfejs, który ma tylko jedną metodę: run(). Tak, Runnable to funkcjonalny interfejs, a jego instancję można utworzyć za pomocą funkcji lambda. Jednak jest to łatwy sposób na zrobienie tego; w przypadku skomplikowanych rzeczy możemy go zaimplementować. Zobacz różnicę tutaj. Chodzi o wymagania:

Chociaż Runnable ma run(), nie jest to klasa Thread, ale tylko klasa Java, dopóki nie przejmie nad nią kontroli (przekaże do) Thread. Rozpoczęcie wątku powoduje, że uruchamialny obiekt run() być nazywanym.

Tak, Java rozwiązała to w wersji 1.5 i jest to Callable.

Callable<V>

Callable to ogólny interfejs. Czemu? Uruchom to polecenie o wartości zwracanej jako ogólne uruchom to polecenie. Callable jest zbyt funkcjonalnym interfejsem i call() jest jedyną metodą, bezargumentową metodą, która zgłasza Exception i zwraca ogólną wartość polecenia run this command.

Implementacja Callable jest bardzo podobna do Runnable:

Zobacz tutaj, wywołanie przetwarza dane i zwraca wartość, którą można zebrać po wykonaniu. Ale czy jest jakaś wielka różnica w przywoływaniu go? Używamy ExecutorService wywołać i Future trzymać wynik. Porozmawiajmy o tym, dlaczego.

Jak widać, nie ma kontrolowanego zachowania tworzenia i uruchamiania wątków (również Runnable lub Callable). Możemy chcieć kontrolować liczbę wątków działających jednocześnie, ponieważ każdy z nich jest powiązany z wątkami systemu operacyjnego. Liczba uruchamianych wątków powinna być mniejsza niż liczba dostępnych rdzeni procesora. Wszystko razem, Java rozwiązuje to przez ExecutorService interfejs.
Powyżej znajduje się artykuł informacyjny na temat Programowanie asynchroniczne w Javie: część I.
Jeśli masz jakiekolwiek pytania dotyczące instrukcji, które udostępniliśmy powyżej, skontaktuj się z nami za pośrednictwem sekcji komentarzy.