– Cześć, Amigo! Mamy nowy, bardzo trudny temat. Przykro mi. Często uważany jest za jeden z najbardziej skomplikowanych tematów nie tylko w Javie, ale także ogólnie w programowaniu. Mam na myśli wielowątkowość.
Wyobraźmy sobie typową grę komputerową, na przykład kosmiczny wyścig. Latasz w przestrzeni kosmicznej, omijając meteoryty i krążowniki patrolowe. Dwa tuziny innych uczestników biorą udział wraz z Tobą w tym nielegalnym wyścigu.
Powiedzmy, że zdecydowałeś/aś się napisać taką grę. Twój program będzie musiał śledzić komendy (wprowadzane z klawiatury), poruszać statkami kosmicznymi, obliczać ich trajektorie, określać konsekwencje ewentualnych kolizji i rysować to wszystko na ekranie użytkownika. To bardzo wygodne i efektywne.
Pamiętasz, jak rozwiązaliśmy «bardzo złożony problem» na przykładzie rozwijającej się firmy przewozowej?
Podzieliliśmy go na niezależne działy i sztywno określiliśmy (ustandaryzowaliśmy), jak one mogą oddziaływać na siebie.
- Ale co zrobimy, gdy niezależne części programu będą musiały wykonywać jakąś pracę równolegle z innymi jego częściami?! Odpowiedzią na to pytanie są wątki.
Spróbuj wyobrazić sobie program jako małego robota, który porusza się wokół kodu i wykonuje komendy. Najpierw wykonuje polecenie w jednej linii, następnie przechodzi do następnej i tak dalej.
- Mogę to sobie wyobrazić. Bułka z masłem!
– Bardzo dobrze. A teraz wyobraź sobie, że masz kilka takich robotów. Podczas gdy jeden obsługuje dane wejściowe użytkownika, drugi aktualizuje obiekty na podstawie tych danych. Trzeci wykonuje kod, aby wyświetlić te obiekty na ekranie. Czwarty kilka razy na sekundę sprawdza, czy jakieś statki się nie zderzyły i jeśli doszło do kolizji, wówczas oblicza wyniki tego zderzenia.
Dlatego też, nie możemy jedynie podzielić programu na niezależne części/obiekty, ale musimy także sprawić, by te części mogły wykonywać swoje zadania niezależnie od siebie. Im mniej interakcji pomiędzy poszczególnymi częściami, tym program jest mniej skomplikowany.
Wyobraź sobie , że byłbyś w stanie zastąpić menedżera skryptem, który wysyła listy. A inne działy firmy nie byłyby nawet w stanie powiedzieć, że nastąpiła jakaś zmiana. Takie rzeczy miały miejsce już w XXVI wieku i ich rezultaty były doskonałe. Większość menedżerów, a nawet najlepszych kierowników, może z powodzeniem być zastąpiona przez skrypt o średnim stopniu złożoności. Masowe zwolnienia menedżerów zakończyły się dopiero po interwencji «związku zawodowego szeregowych pracowników biurowych». Ale to tylko taka dygresja.
– Ależ ciekawe!
– Oprócz tego, że takich „małych robotów”, które wykonują kod, może być więcej, to jeszcze mogą one komunikować się ze sobą i rozmnażać.
– Tworzyć nowe roboty?
– Tak, do wykonywania nowych zadań. Czasami korzystne jest stworzenie innego robota (innego wątku) do wykonywania pewnych działań w tym samym czasie, co obecny wątek (robot).
– Brzmi to dobrze, ale trudno jest mi wyobrazić sobie, gdzie bym mógł tego użyć.
No i dlaczego nazywamy je «wątkami»?
– Wyobraź sobie, że każdy robot jest innego koloru, a polecenia, które wykonuje, oznacza swoim kolorem. Ścieżka wybrana przez małego robota jest jak linia pozostawiona przez ołówek. Ta ścieżka ciągnie się za robotem jak nitka za igłą.
Każdy «mały robot» ma zadanie do wykonania, dla którego został stworzony. Możesz wyobrazić sobie, że wątek to zestaw poleceń wykonywanych podczas realizacji tego zadania.
Powiedzmy, że lecisz na statku kosmicznym, który ma dostarczyć ładunek. W takim przypadku «dostarczenie ładunku» jest Twoim zadaniem, a Ty jesteś w trakcie jego wykonywania. A tor Twojego lotu to Twój wątek. Można powiedzieć, że każde nowe zadanie, każde niedokończone zadanie, ma swoją własną nitkę (ścieżkę, którą trzeba jeszcze przebyć).
– Innymi słowy, jest zadanie i jest „mały robot”, który je wykonuje. A wątek to po prostu ścieżka, którą robot porusza się, gdy wykonuje swoje zadanie?
– Dokładnie.
Dokładnie tak to właśnie działa. Ponieważ komputer ma tylko jeden procesor, może wykonywać tylko jedno polecenie naraz. Więc wygląda to tak: procesor ciągle przełącza się między wątkami. Przełącza się na nowy wątek, wykonuje kilka poleceń, potem przechodzi do następnego wątku i znów wykonuje kilka poleceń i tak dalej. Ale ponieważ przełączanie między wątkami występuje setki razy na sekundę, mamy wrażenie, że wszystkie wątki realizowane są jednocześnie.
GO TO FULL VERSION