Jason. Cała informatyka w jednym miejscu!

Oto przed Wami rozdział poświęcony wątkom w języku Java. Wczoraj opisałem dosyć rozlegle jak to wygląda teoretycznie. Programowanie współbieżne przeznaczone jest tylko dla nieco bardziej "kumatych" w tej dziedzinie i z pewnością amatorzy się w tym nie odnajdą. Dzisiaj uzupełnimy sobie tę wiedzę o drugą "połowę", czyli praktykę. Utworzymy sobie własny pierwszy nowy obiekt "Thread" w języku w Java, o którym będziecie słyszeć najczęściej w kontekście programowania wielowątkowego!

"THREAD" W JĘZYKU JAVA. CZĘŚĆ PRAKTYCZNA

Głównym elementem jaki nam umożliwia tworzenie wątków w języku Java jest "Runnable". "Runnable" jest interfejsem i należy do pakietu "java.lang", więc nie trzeba się przejmować jakimkolwiek importem, gdyż ten pakiet jest przydzielany każdemu nowo tworzonemu programowi z automatu. "Thread" to druga rzecz, która okaże się niezbędna w niniejszym eksperymencie i ma ścisły związek z "Runnable". Pierwszy wymieniony określa zadania dla tworzonego wątku (mogą one być w postaci wyrażenia lambda, gdyż jest to interfejs funkcyjny), a drugi umożliwia jego uruchomienie, bo sam fakt utworzenia obiektu wątku nie powoduje jego natychmiastowego "włączenia". Trzeba to zrobić ręcznie za pomocą metody "start" i temu służy klasa "Thread".

PRZYKŁAD KODU ŹRÓDŁOWEGO

Nadszedł czas na napisanie pierwszego kodu. Utwórzcie sobie nowy projekt i wklejcie do niego dwie poniższe klasy. Wątek w języku Java można utworzyć na kilka różnych sposobów, ale na razie skupmy się na poznanych obiektach:

KLASA "MAIN"

public class Main {
	public static void main(String[] args) {
		new FirstThread();
	}
}

KLASA "FIRSTTHREAD"

public class FirstThread {
	public FirstThread() {
		Runnable runnable = () -> {
			try {
				for (int i = 1; i <= 5; ++i) {
					System.out.println("Iteracja #" + i);
					Thread.sleep(1000);
				}

				System.out.println("Koniec!");
			}
			catch (Exception exception) {
				exception.printStackTrace();
			}
		};

		Thread thread = new Thread(runnable);

		thread.start();
	}
}

Oto najprostsza forma tworzenia wątku z użyciem interfejsu "Runnable" oraz instancji "Thread" w języku Java. Należy rozróżnić jedno od drugiego i przyjąć do wiadomości, że "Runnable" jest interfejsem, a "Thread" to klasa. Aby uatrakcyjnić nieco działanie, dodałem od siebie "usypianie" wątku. Metoda statyczna "sleep" pozwala na tymczasowe "uśpienie" wykonywanych operacji w podanym wątku na określoną liczbę milisekund. Pozwala to nieco "nagiąć" zachowanie ukrytego mechanizmu zarządzającego wątkami (decyduje on który wątek teraz ma "prawo" działać, więcej informacji tutaj), bo nie ma ŻADNEJ gwarancji, że taki i taki wątek będzie zawsze się wykonywał w tej samej kolejności!

Wątki mają to do siebie, że przypominają prawdziwą rywalizację. "Ścigają się" o to, który z nich będzie mógł jako pierwszy zakończyć swoje zadanie przydzielone przez programistę. Powyższy wątek tego nie pokazuje, ale gdy zrobimy sobie przykład z dwoma wątkami pracującymi jednocześnie, będziecie mogli dostrzec to zjawisko "wyścigu", o którym napisałem. Jednym zdaniem powoduje to to, że możemy za każdym razem uruchomienia aplikacji otrzymać różne wyniki!

Po uruchomieniu programu, ujrzycie pięć tekstów pojawiających się po kolei co sekundę. Co sekundę, nie natychmiastowo, chociaż metodę "sleep" można bez problemów wykorzystać całkowicie poza wątkami. Wymaga ona jedynie zdefiniowania bloku "try-catch" z powodu możliwości przerwania "usypiania" kombinacją "Ctrl+C" (sygnał przerwania działania procesu).

Klasa "Thread" i interfejs "Runnable" w języku Java

Wątek w języku Java składa się z dwóch osobno tworzonych elementów: interfejsu "Runnable" określającego zadania do wykonania oraz klasy "Thread" określającej "moment" rozpoczęcia wątku.


Zakończyliśmy wspólnie pierwszy krok w kierunku programowania współbieżnego w Javie. Uwierzcie mi, że to jest dopiero wierzchołek góry lodowej. Tu jest dalszy ciąg.

PODOBNE ARTYKUŁY