Lecimy dalej naprzód z wątkami w Javie! Dzisiaj skonfrontujemy oba sposoby tworzenia wątków. Jest możliwość zrobienia tego od strony dziedziczenia klasy "Thread", ale mamy również do dyspozycji implementację interfejsu "Runnable". Którą drogę wybrać? Czy są jakieś różnice w działaniu? A może w efektywności? Przekonajcie się już teraz. Wątek w Java tworzony na dwa sposoby zapisu.

WĄTEK W JAVA. DZIEDZICZENIE KLASY "THREAD"

Jedną z dróg jest tworzenie wątku przez dziedziczenie klasy "Thread". Zwyczajnie tworzymy sobie nową klasę i dopisujemy "extends Thread". Potem przesłaniamy metodę "run" i od tej chwili możemy pisać dowolne polecenia jakie się mają wykonać po uruchomieniu tego wątku. Plusem jest to, że nie ma odseparowania zadania od wątku, czyli części wykonawczej od uruchomieniowej. Minus jest dosyć dotkliwy, pozbawiacie się możliwości rozszerzania o dowolną inną klasę! Przypominam, że Java nie zezwala na wielokrotne dziedziczenie i na podstawie jednego z poprzednich artykułów udowodniłem dlaczego.

Struktura "kodowa" wygląda prosto:

public class NewClass extends Thread
{
	@Override
	public void run()
	{
		// polecenia
	}
}

W środku metody "run" określamy polecenia tak samo, jak robiliśmy to poprzednio w "Runnable" tylko, że wszystko jest w jednym miejscu. Następnie tworzycie sobie instancję tak jak zwykle i wystarczy wywołać metodę "start".

WĄTEK W JAVA. IMPLEMENTACJA INTERFEJSU "RUNNABLE"

Druga możliwość polega na zaimplementowaniu interfejsu "Runnable" do klasy i przesłonięcie metody "run", które teraz jest OBOWIĄZKOWE i wstawienie tam dowolnych poleceń. Osobiście skorzystałbym z tej metody ze względu na fakt, iż w razie potrzeby, mogę sobie implementować jeszcze więcej interfejsów, a wolne miejsce na potencjalne dziedziczenie wciąż istnieje.

Tak wygląda wątek w Java w klasie "wspieranej" za pomocą interfejsu:

public class NewClass implements Runnable
{
	@Override
	public void run()
	{
		// polecenia
	}
}

Tworzymy sobie później obiekt na jej podstawie i "podpinamy" to pod osobny obiekt klasy "Thread", a resztę już znacie.

PRZYKŁAD Z DWOMA WĄTKAMI JEDNOCZEŚNIE

Na koniec, zostawiam Wam przykład paru kodów źródłowych które skompilowane, uruchomią dwa wątki w tym samym czasie. Jeden wątek w Java utworzony przez dziedziczenie klasy "Thread", a drugi poprzez implementację interfejsu "Runnable". Radzę uważnie obserwować wyniki. Wypisy tekstów na konsolę pokażą bardzo ważne zjawisko polegające na "ściganiu się" wątków. W efekcie końcowym ujrzycie losową kolejność występowania komunikatów co każdą iterację.

  • KLASA "Main"
public class Main
{
	public static void main(String[] args)
	{
		new Launcher();
	}
}
  • KLASA "Launcher"
public class Launcher
{
	public Launcher()
	{
		ThreadFromInterface tfi = new ThreadFromInterface();
		ThreadFromClass tfc = new ThreadFromClass();
		Thread threadForInterface = new Thread(tfi);

		tfc.start();
		threadForInterface.start();
	}
}
  • KLASA "ThreadFromClass"
public class ThreadFromClass extends Thread
{
	@Override
	public void run()
	{
		try
		{
			for (int i = 1; i <= 5; ++i)
			{
				System.out.println("Iteracja #" + i + " z wątku z klasy");
				Thread.sleep(1000);
			}

			System.out.println("Koniec z wątku z klasy!");
		}
		catch (Exception exception)
		{
			exception.printStackTrace();
		}
	}
}
  • KLASA "ThreadFromInterface"
public class ThreadFromInterface implements Runnable
{
	@Override
	public void run()
	{
		try
		{
			for (int i = 1; i <= 5; ++i)
			{
				System.out.println("Iteracja #" + i + " z wątku z interfejsu");
				Thread.sleep(1000);
			}

			System.out.println("Koniec z wątku z interfejsu!");
		}
		catch (Exception exception)
		{
			exception.printStackTrace();
		}
	}
}

Najlepiej będzie jak to sobie skompilujecie i uruchomicie sami. I jeszcze jedno: nie stwierdzono żadnych różnic w płynności działania przy użyciu jednej i drugiej metody. Można korzystać z obu bez żadnych obaw o "performance".

Prezentacja wyników działania obu wątków naraz - wątek w Java

Tak MOGĄ wyglądać wyniki działania obu wątków jednocześnie! MOGĄ, bo wątki będą się "ścigać" który z nich jako pierwszy będzie mógł wykonać swoje zadanie.


Tak oto zakończyliśmy kolejny fragment większego rozdziału ukazujące jak się tworzy i prezentuje wątek. Potrenujcie sobie sami, tylko tak zrozumienie szybciej przyjdzie do głów. A tutaj znajdziecie kontynuację rozdziału. Wątek w Java jest bardzo rozległym tematem.

PODOBNE ARTYKUŁY