"Здравей, Амиго! Имаме нова и много трудна тема. Съжалявам. Често се смята за една от най-сложните теми не само в Java, но и в програмирането като цяло. Говоря за многопоточност . "

Представете си типична компютърна игра, например състезателна игра с космически кораби. Вие летите през просторите на космоса, избягвайки метеорити и патрулни крайцери. Две дузини други участват с вас в тези незаконни състезания.

Да приемем, че решите да напишете такава игра. Вашата програма ще трябва да следи командите (въвеждане от клавиатурата), да движи космическите кораби, да изчислява техните траектории, да определя последствията от всяHowви сблъсъци и да рисува всичко това на екрана на потребителя. Това е много сложна работа.

Помните ли How решихме „проблем с голяма сложност“ в примера за разрастващата се корабна компания?

Разделихме го на независими отдели и строго определихме (стандартизирахме) How те могат да си взаимодействат.

„Но Howво правим, когато независимите части трябва да изпълняват няHowва работа успоредно с другите части?! Отговорът на този въпрос е нишки .“

Опитайте се да си представите програма като малък робот , който работи около codeа и изпълнява команди . Първо изпълнява команда на един ред, след това преминава към следващия и т.н.

„Виждам го в ума си. Парче торта!“

„Много добре. А сега си представете, че имате няколко от тези роботи. Докато един обработва въвеждането на потребителя, вторият актуализира обекти въз основа на този вход. Трети изпълнява codeа за показване на тези обекти на екрана. Няколко пъти в секунда, четвъртият проверява дали корабите са се сблъскали и ако са се сблъскали, изчислява резултатите от сблъсъка."

Така можем не само да разделим програмата на независими части/обекти, но и да направим така, че тези части да могат да изпълняват работата си независимо една от друга. Колкото по-малко взаимодействие между отделните части, толкова по-малко сложна е програмата.

Представете си, че сте успели да замените мениджъра със скрипт , който изпраща писма . А другите отдели на компанията дори не можеха да кажат, че има промяна. Подобни неща се случиха още през 26-ти век с отлични резултати. Повечето мениджъри и дори висши ръководители могат успешно да бъдат заменени със скрипт със средна сложност. Едва след намесата на „синдиката на офис планктона“ свършиха масовите уволнения на мениджъри. Но аз се отклоних.

"Колко интересно!"

„Не само че може да има няколко от тези „малки роботи“, изпълняващи code, те също могат да комуникират помежду си и да създават нови роботи.“

„Създаване на нови роботи?“

„Да, за изпълнение на нови задачи. Понякога е изгодно да създадете друг робот (друга нишка), за да извършите няHowво действие едновременно с текущата нишка (робот).“

Това звучи като нещо добро, но не мога да се сетя къде бих го използвал.

И защо ги наричаме „ нишки “?

„Представете си, че всеки робот е с различен цвят и маркира команди с цвета си, докато ги изпълнява. Пътят, изминат от малкия робот, е като линията, оставена от молив. Този път се простира зад робота, като нишка зад игла."

Всеки „малък робот“ има задача, за която е създаден. Можете да мислите, че нишката е набор от команди, изпълнявани по време на изпълнение на тази задача.

Да приемем, че летите на космически кораб, за да доставите товари. Тогава «доставянето на товари» е вашата задача и вие сте в средата на изпълнението й. И вашият полетен път е вашата нишка. Можем да кажем, че всяка нова задача, всяка незавършена задача има своя нишка (път, който все още трябва да бъде извървян).

"С други думи, има задача и "малък робот", който я изпълнява. А нишката е просто пътят, изминат от робота, докато изпълнява задачата си?"

"Точно."

Ето How всичко работи дълбоко вътре. Тъй като компютърът има само един процесор, той може да изпълнява само една команда наведнъж. И така, ето Howво се случва: процесорът постоянно превключва между нишки. Той превключва към нова нишка, изпълнява няколко команди, след това превключва към следващата нишка, изпълнява няколко команди и т.н. Но тъй като превключването между нишките се случва стотици пъти в секунда, ни се струва, че всички нишки работят едновременно.

Многопоточност - 1