Oto przed Wami część druga rozdziału poświęconego 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 wątek w Java!

WĄTEK W JAVA. CZĘŚĆ PRAKTYCZNA

Od tej pory, trzymamy się wątków tylko ze strony języka Java. Głównym obiektem jaki nam umożliwia tworzenie wątków jest "Runnable". "Runnable" 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. Pierwszy wymieniony określa zadania dla tworzonego wątku (może to być w postaci wyrażenia lambda), 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" w klasie "Thread".

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

  • 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 ze strony "Runnable" oraz "Thread". 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". Metoda statyczna "sleep" pozwala na tymczasowe "uśpienie" wykonywanych operacji na podaną 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 w Java 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. Po uruchomieniu programu, ujrzycie pięć tekstów pojawiających się po kolei co sekundę. Co sekundę, nie natychmiastowo, chociaż tę metodę można bez problemów wykorzystać całkowicie poza wątkami. Wymaga ona jedynie zdefiniowania bloku "try-catch".

Interfejs "Runnable" i klasa "Thread" - wątek w Java

Wątek w 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