Мултитхреадинг у Јава лекцији са примерима

Преглед садржаја:

Anonim

Свака апликација може имати више процеса (инстанци). Сваки од овог процеса може се доделити или као једна нит или као више нити. У овом упутству ћемо видети како истовремено изводити више задатака, а такође ћемо сазнати више о нитима и синхронизацији између нити.

У овом упутству ћемо научити:

  • Шта је појединачна нит
  • Шта је Мултитхреадинг у Јави?
  • Животни циклус нити у Јави
  • Јава синхронизација нити
  • Пример вишенаменског Јава-а

Шта је појединачна нит?

Једна нит је у основи лагана и најмања јединица обраде. Јава користи нити користећи „класу теме“.

Постоје две врсте нити - корисничка нит и демон демон (даемон нити се користе када желимо да очистимо апликацију и користе се у позадини).

Када апликација први пут започне, креира се нит корисника. Пошаљите то, можемо створити много корисничких нити и демонских нити.

Пример појединачне нити:

пакет демотест;јавна класа ГуруТхреад{јавна статичка воид главна (Стринг [] аргс) {Систем.оут.принтлн ("Једна нит");}}

Предности једног навоја:

  • Смањује режијске трошкове у апликацији док се извршава једна нит у систему
  • Такође, смањује трошкове одржавања апликације.

Шта је Мултитхреадинг у Јави?

МУЛТИТХРЕАДИНГ у Јави је процес извршавања две или више нити истовремено до максималног искоришћења ЦПУ-а. Вишенитне апликације извршавају истовремено две или више нити. Отуда је у Јави познат и под називом Цонцурренци. Свака нит иде паралелно једна са другом. Вишеструке нити не додељују одвојено меморијско подручје, стога штеде меморију. Такође, пребацивање контекста између нити траје мање времена.

Пример више нити:

пакет демотест;јавна класа ГуруТхреад1 имплементира Руннабле{јавна статичка воид главна (Стринг [] аргс) {Тхреад гуруТхреад1 = нова нит ("Гуру1");Тхреад гуруТхреад2 = нова нит ("Гуру2");гуруТхреад1.старт ();гуруТхреад2.старт ();Систем.оут.принтлн ("Имена нити су следећа:");Систем.оут.принтлн (гуруТхреад1.гетНаме ());Систем.оут.принтлн (гуруТхреад2.гетНаме ());}@Прегазитипублиц воид рун () {}}

Предности мултитхреада:

  • Корисници нису блокирани јер су нити независне и можемо истовремено да изведемо више операција
  • Како су такве нити независне, остале нити неће бити погођене ако једна нит испуни изузетак.

Животни циклус нити у Јави

Животни циклус нити:

Постоје различите фазе животног циклуса конца као што је приказано на горњем дијаграму:

  1. Нова
  2. Руннабле
  3. Трчање
  4. Чекање
  5. Мртав
  1. Ново: У овој фази нит се креира помоћу класе „Класа нити“. Она остаје у овом стању док програм не покрене нит. Такође је познат као рођена нит.
  2. Изводљиво: На овој страници се инстанца нити позива методом покретања. Контрола нити се даје планеру да заврши извршење. Зависи од планера, да ли ће покренути нит.
  3. Покретање: Када нит почне да се извршава, тада се стање мења у стање „покренуто“. Планер бира једну нит из спремишта нити и она почиње да се извршава у апликацији.
  4. Чекање: Ово је стање када нит мора да чека. Како у апликацији ради више нити, постоји потреба за синхронизацијом између нити. Дакле, једна нит мора чекати, док се друга нит не изврши. Стога се ово стање назива стањем чекања.
  5. Мртво: Ово је стање када се нит прекида. Нит је у активном стању и чим заврши обраду у „мртвом је стању“.

Неке од најчешће коришћених метода за нити су:

Метод Опис
почетак() Ова метода започиње извршавање нити, а ЈВМ позива методу рун () на нити.
Спавање (инт милисекунде) Овом методом нит се прекида у мировању, стога ће се извршавање нити зауставити у предвиђеним милисекундама, а након тога нит почиње да се извршава. Ово помаже у синхронизацији нити.
гетНаме () Враћа име нити.
сетПриорити (инт невприорити) Мења приоритет нити.
принос () Узрокује извршавање тренутне нити на заустављању и других нити.

Пример: У овом примеру ћемо створити нит и истражити уграђене методе доступне за нити.

пакет демотест;јавна класа тхреад_екампле1 имплементира Руннабле {@Прегазитипублиц воид рун () {}јавна статичка воид главна (Стринг [] аргс) {Тема гурутхреад1 = нова нит ();гурутхреад1.старт ();покушати {гурутхреад1.слееп (1000);} цатцх (ИнтерруптедЕкцептион е) {// ТОДО Аутоматски генерисани блок уловае.принтСтацкТраце ();}гурутхреад1.сетПриорити (1);инт гуруприорити = гурутхреад1.гетПриорити ();Систем.оут.принтлн (гуруприоритет);Систем.оут.принтлн („Покретање нити“);}}

Објашњење кода:

  • Линија кода 2: Стварамо класу „тхреад_Екампле1“ која имплементира интерфејс који се може покренути (требало би да га имплементира било која класа чија инстанца треба да изврши нит).
  • Линија кода 4: Замењује методу покретања интерфејса који се може покренути, јер је обавезно надјачати ту методу
  • Кодни ред 6: Овде смо дефинисали главну методу у којој ћемо започети извршавање нити.
  • Кодни ред 7: Овде креирамо ново име нити као „гурутхреад1“ инстанцирањем нове класе нити.
  • Кодни ред 8: користићемо методу „старт“ нити помоћу инстанце „гурутхреад1“. Овде ће нит почети да се извршава.
  • Кодни ред 10: Овде користимо методу „спавања“ нити помоћу инстанце „гурутхреад1“. Дакле, нит ће спавати 1000 милисекунди.
  • Шифра 9-14: Овде смо методи спавања ставили блок три цатцх јер постоји означени изузетак који се јавља, тј. Прекинут изузетак.
  • Редак кода 15: Овде постављамо приоритет нити на 1 из било ког приоритета
  • Линија кода 16: Овде добијамо приоритет нити користећи гетПриорити ()
  • Линија кода 17: Овде исписујемо вредност преузету из гетПриорити
  • Редак 18: Овде пишемо текст који нит ради.

Када извршите горњи код, добићете следећи излаз:

Излаз:

5 је приоритет теме, а покретање нити је текст који је резултат нашег кода.

Јава синхронизација нити

У мултитхреадинг-у постоји асинхроно понашање програма. Ако једна нит уписује неке податке, а друга нит која истовремено чита податке, то може створити недоследност у апликацији.

Када постоји потреба за приступом дељеним ресурсима помоћу две или више нити, тада се користи приступ синхронизацији.

Јава је обезбедила синхронизоване методе за примену синхронизованог понашања.

У овом приступу, када нит досегне унутар синхронизованог блока, тада ниједна друга нит не може позвати ту методу на истом објекту. Све нити морају сачекати док та нит заврши синхронизовани блок и изађе из тога.

На тај начин синхронизација помаже у вишетреној апликацији. Једна нит мора сачекати док друга нит не заврши своје извршавање тек тада су друге нити дозвољене за извршење.

Може се написати у следећем облику:

Синхронизовано (објекат){// Блок изјава које треба синхронизовати}

Пример вишенаменског Јава-а

У овом примеру ћемо узети две нити и дохватити имена нити.

Пример1:

ГуруТхреад1.јавапакет демотест;јавна класа ГуруТхреад1 имплементира Руннабле {/ *** @парам аргс* /јавна статичка воид главна (Стринг [] аргс) {Тхреад гуруТхреад1 = нова нит ("Гуру1");Тхреад гуруТхреад2 = нова нит ("Гуру2");гуруТхреад1.старт ();гуруТхреад2.старт ();Систем.оут.принтлн ("Имена нити су следећа:");Систем.оут.принтлн (гуруТхреад1.гетНаме ());Систем.оут.принтлн (гуруТхреад2.гетНаме ());}@Прегазитипублиц воид рун () {}}

Објашњење кода:

  • 3. ред кода: Заузели смо класу „ГуруТхреад1“ која имплементира Руннабле (требало би да је имплементира било која класа чије инстанце требају бити извршене помоћу нити).
  • Кодни ред 8: Ово је главна метода класе
  • 9. ред кода: Овде инстанцирамо класу Тхреад и креирамо инстанцу која се назива „гуруТхреад1“ и креирамо нит.
  • Линија кода 10: Овде инстанцирамо класу Тхреад и креирамо инстанцу названу „гуруТхреад2“ и креирамо нит.
  • Шифра 11: Покрећемо нит, тј. ГуруТхреад1.
  • Кодни ред 12: Покрећемо нит, тј. ГуруТхреад2.
  • Кодни ред 13: Излаз текста као „Имена нити су следећа:“
  • 14. ред ретка: Добијање имена нити 1 помоћу методе гетНаме () класе нити.
  • Редак кода 15: Добијање имена нити 2 помоћу методе гетНаме () класе нити.

Када извршите горњи код, добићете следећи излаз:

Излаз:

Имена нити се овде износе као

  • Гуру1
  • Гуру2

Пример 2:

У овом примеру ћемо научити о замени метода рун () и старт () методе за покретање интерфејса и креираћемо две нити те класе и покренути их у складу с тим.

Такође, похађамо два часа,

  • Онај који ће применити интерфејс за покретање и
  • Још један који ће имати главни метод и извршити се у складу с тим.
пакет демотест;јавна класа ГуруТхреад2 {јавна статичка воид главна (Стринг [] аргс) {// ТОДО Аутоматски генерисани квар методеГуруТхреад3 тхреадгуру1 = нови ГуруТхреад3 ("гуру1");тхреадгуру1.старт ();ГуруТхреад3 тхреадгуру2 = нови ГуруТхреад3 ("гуру2");тхреадгуру2.старт ();}}класа ГуруТхреад3 имплементира Руннабле {Тхреад гурутхреад;привате Стринг гурунаме;ГуруТхреад3 (име низа) {гурунаме = име;}@Прегазитипублиц воид рун () {Систем.оут.принтлн („Покренута нит“ + гурунаме);за (инт и = 0; и <4; и ++) {Систем.оут.принтлн (и);Систем.оут.принтлн (гурунаме);покушати {Тхреад.слееп (1000);} цатцх (ИнтерруптедЕкцептион е) {Систем.оут.принтлн („Тема је прекинута“);}}}јавни воид старт () {Систем.оут.принтлн („Тема је започета“);иф (гурутхреад == нулл) {гурутхреад = нова нит (ово, гурунаме);гурутхреад.старт ();}}}

Објашњење кода:

  • Линија кода 2: Овде полазимо класу „ГуруТхреад2“ која ће у себи имати главни метод.
  • Линија 4: Овде узимамо главни метод класе.
  • Линија кода 6-7: Овде креирамо инстанцу класе ГуруТхреад3 (која је креирана у доњим редовима кода) као „тхреадгуру1“ и започињемо нит.
  • Редак 8-9: Овде креирамо још једну инстанцу класе ГуруТхреад3 (која је креирана у доњим редовима кода) као „тхреадгуру2“ и започињемо нит.
  • Линија кода 11: Овде креирамо класу „ГуруТхреад3“ која имплементира интерфејс који се може покренути (требало би да га имплементира било која класа чије инстанције треба да извршава нит).
  • Кодни ред 13-14: узимамо две променљиве класе од којих је једна класе типа нит, а друга класе стринга.
  • Линија кода 15-18: надјачавамо конструктор ГуруТхреад3, који узима један аргумент као тип низа (који је име нити) који се додељује променљивој класе гурунаме и отуда је име нити сачувано.
  • Редак кода 20: Овде надјачавамо методу рун () интерфејса који се може покренути.
  • Линија 21: Избацујемо име нити помоћу наредбе принтлн.
  • Линија кода 22-31: Овде користимо фор петљу са бројачем који је иницијализован на 0, и он не би требало да буде мањи од 4 (можемо узети било који број, па ће овде петља радити 4 пута) и повећавамо бројач. Штампајмо име нити, а такође омогућава да нит пређе у стање мировања од 1000 милисекунди у оквиру блока три-цатцх јер је начин спавања покренуо означени изузетак.
  • Линија кода 33: Овде надјачавамо методу покретања интерфејса за покретање.
  • Линија кода 35: Излазимо из текста „Тема је започета“.
  • Кодни ред 36-40: Овде узимамо услов иф да бисмо проверили да ли променљива класе гурутхреад има вредност у себи или не. Ако је нулл, онда креирамо инстанцу користећи класу нити која узима име као параметар (вредност за коју је додељена у конструктору). Након чега се нит покреће методом старт ().

Када извршите горњи код, добићете следећи излаз:

Излаз :

Дакле, постоје две нити, два пута добијамо поруку „Тема је започета“.

Имена нити добијамо онако како смо их избацили.

Улази у петљу фор где исписујемо бројач и име нити, а бројач почиње са 0.

Петља се извршава три пута, а између нити се спава 1000 милисекунди.

Отуда прво добијамо гуру1, затим гуру2, па поново гуру2, јер нит овде спава 1000 милисекунди, а затим следећи гуру1 и поново гуру1, нит спава 1000 милисекунди, тако да добијамо гуру2, а затим гуру1.

Резиме :

У овом упутству смо видели вишенитне апликације на Јави и како се користе појединачне и више нити.

  • У мултитхреадинг-у, корисници нису блокирани јер су нити независне и могу истовремено да извршавају више операција
  • Разне фазе животног циклуса нити су,
    • Нова
    • Руннабле
    • Трчање
    • Чекање
    • Мртав
  • Такође смо сазнали о синхронизацији између нити, које помажу апликацији да несметано ради.
  • Мултитхреадинг олакшава много више апликативних задатака.