multithreading java tutorial with examples
Овај водич објашњава све о мултитхреадинг-у у Јави, имплементацији паралелности, животном циклусу нити, примеру класе нити, Тхреад-у користећи Руннабле Интерфаце:
Истовременост у рачунарском свету је способност система (било да је то апликација, рачунар или програмски језик) да паралелно извршава неколико инстанци програма или апликације.
Истодобним покретањем инстанци или програма осигуравамо високу пропусност и веће перформансе јер можемо искористити неискориштене ресурсе попут хардвера оперативног система итд. На пример, ако систем има неколико ЦПУ-а, онда апликација може ефикасно да их користи и повећа проток.
=> Посетите овде за ексклузивну серију лекција за Јава тренинг.
Шта ћете научити:
Шта је Мултитхреадинг у Јави
У Јави се нити могу гледати као окосница истовремености. Нит је извршна, лагана јединица која приступа заједничким ресурсима, као и сопственом стеку позива.
Јава апликација је један процес и у оквиру ове апликације можемо имати више нити за постизање паралелности.
Знамо да апликација која се изводи на систему може имати више инстанци и оне се обично зову апликације са више докумената. Ове инстанце апликације називају се процеси. Сваком од ових процеса додељена је извршна јединица позната као нит.
У зависности од оперативног система и захтева апликације, процесу се може доделити једна нит или више нити. Када је процесу апликације додељено више нити, тада морамо истовремено извршити те више нити.
' Ова техника извршавања или извођења више нити истовремено или истовремено позната је као вишеструко увођење у нит . '
Мултитхреадинг једноставно значи да -имамо више од једне нити која се извршава унутар исте апликације.
Програмски језик Јава има уграђену подршку за мултитхреадинг.
Мултитхреадинг је приказан на горњем дијаграму. Као што је приказано, постоји више нити које се истовремено изводе у апликацији.
На пример, десктоп апликација која пружа функционалност попут уређивања, штампања итд. је вишеструка апликација. У овој апликацији, пошто је штампање у позадини, можемо истовремено извршавати уређивање докумената и штампање докумената додељивањем ових функција двема различитим нитима.
Нити у вишенитним апликацијама паралелно се изводе паралелно једна на другу. Стога је мултитреадинг такође део истовремене употребе Јава-а. Имајте на уму да иако постоји више нити, они деле меморијско подручје чиме штеде на меморији. Такође, нити могу лако да промене контекст у кратком времену.
Мултитхреадинг је углавном користан јер омогућава истовремено извршавање два или више делова апликације. Ово омогућава апликацији да максимално искористи процесорско време, а време мировања је сведено на минимум.
Следе неки од појмова које бисмо требали знати у вези са окружењем са више нити, јер се они често користе.
Мултитаскинг: У мултитаскингу се истовремено извршава више задатака.
Мултитхреадинг: Мултитхреадинг, као што је већ поменуто, поступак је извршавања више нити истовремено.
ц ++ питања за кодирање интервјуа
Вишепроцесирање: У вишепроцесирању се истовремено извршава више процеса. Слично мултитаскингу, али овде је укључено више процесора.
Паралелна обрада: Паралелна обрада је техника где више процесора истовремено ради у рачунарском систему.
Након расправе о мултитреадингу поставља се питање зашто нам је мултитхреадинг уопште потребан?
Предности мултитхреадинг-а
Мултитхреадинг има разне предности које помажу у ефикасном програмирању.
Тачке у наставку ће то јасно показати.
# 1) Ефикасна употреба појединачних ЦПУ система
Када у систему постоји само један процесор, са једном нити, тада се троши време процесора. Када је нит заузета коришћењем других ресурса попут ИО, ЦПУ мирује. То можемо побољшати и боље искористити ЦПУ тако што ћемо имати вишенитне апликације.
Коришћењем мултитхреадинга, ако је једна нит урађена са ЦПУ-ом, онда је друга нит може искористити. Са више нити, време мировања процесора ће се знатно смањити.
# 2) Ефикасна употреба више ЦПУ система
Баш као и појединачни ЦПУ, чак и са системима који имају више ЦПУ-а, мултитхреадинг апликације су у могућности да ефикасно користе више ЦПУ-а.
# 3) Побољшано корисничко искуство с обзиром на одзивност и правичност
Одзив система се побољшава са вишенитним апликацијама. Ми не доживљавамо „ГУИ виси“ када имамо више нити које извршавају различите задатке у апликацији и корисници не морају дуго да чекају да би добили одговор на своје захтеве.
Слично томе, корисници су исправно сервиси у вишенитним системима.
Како применити паралелност у Јави
Прва класа помоћу које можемо применити паралелност у Јави је јава.ланг.Тхреад класа. Ова класа Тхреад чини основу истовремености у Јави.
Такође имамо јава.ланг.Руннабле интерфејс који Јава класа може применити да апстрахује понашање нити. За напредни развој апликација можемо користити јава.утил.цонцуррент пакет доступан од Јаве 1.5.
Крећући се напред, детаљно ћемо разговарати о паралелности у Јави. Размотримо и разумемо концепт нити у Јави у овом упутству. У нашим наредним водичима о мултитхреадинг-у истраживаћемо различите концепте мултитхреадинг-а и паралелности.
Шта је нит у Јави
Једна нит се може дефинисати као најмања и лагана јединица обраде. У Јави се нити користе у програмима који користе класу „Тхреад“.
Јава нити су два типа:
# 1) Корисничка нит: корисничка нит се креира при првом покретању апликације. Тада можемо створити што више нити корисника и демона.
# 2) Даемон нит: даемон нити се углавном користе у позадини и користе се за задатке попут чишћења апликације итд.
Нити смањују трошкове одржавања апликације. Такође смањује опште трошкове апликације.
Пример једне нити је приказан у наставку:
public class Main{ public static void main (String () args){ System.out.println('This is a thread'); } }
Горњи програм ће приказати „Ово је нит“, када се апликација покрене, креира се корисничка нит. У горе наведеном програму, главна функција је почетна тачка апликације и она ствара корисничку нит.
Животни циклус нити
Следећи дијаграм приказује животни циклус нити у Јави.
Као што је приказано на горњем дијаграму, нит у Јави има следећа стања:
# 1) Ново: У почетку, нит која је управо креирана из класе нити има „ново“ стање. Тек треба започети. Ова нит се такође назива „Рођена нит“ .
# 2) Може се покренути: У овом стању, инстанца нити се позива помоћу методе 'почетак' .
# 3) Трчање: Позива се метода покретања инстанце нити и нит започиње извршење. Ово је текуће стање. Углавном планер планира и управља нитима.
# 4) Блокирано: У апликацији постоји више нити. Ове нити морају сачекати другу јер се њихово извршавање мора синхронизовати.
# 5) Укинуто: Када се процес извршавања нити заврши, нит се прекида или се њено извршавање зауставља.
Дакле, нит се прво креира, затим заказује, а касније планер извршава нит. Иако покренута нит може бити блокирана или суспендована због неке друге активности. Затим се наставља и док се обрада завршава, нит се извршава.
Приоритети теме
Приоритет нити одлучује како ће се једна нит третирати у односу на друге нити у апликацији. Приоритет нити је цео број.
У наставку су наведене неке тачке које треба запамтити у вези са приоритетима нити:
- Приоритети нити су целобројни бројеви.
- Користећи приоритет нити, можемо одлучити када треба да пређемо са једне нити у текуће стање на другу. Ово је процес пребацивања контекста у којем мењамо контекст нити.
- У било ком тренутку нит може добровољно ослободити контролу над ЦПУ-ом. Тада нит са највишим приоритетом може преузети.
- Слично томе, нит са већим приоритетом може да преузме било коју другу нит са нижим приоритетом.
- Класа теме пружа методу сетПриорити () која се користи за постављање приоритета нити.
- Такође на месту целих бројева можемо користити константе МИН_ПРИОРИТИ, МАКС_ПРИОРИТИ или НОРМ_ПРИОРИТИ.
Направи нит
Нит можемо створити на један од следећих начина:
- Проширење класе Јава ‘Тхреад’.
- Имплементација „Руннабле“.
Проширење класе Јава „Тхреад“
Класа „Тхреад“ садржи конструкторе и методе који нам омогућавају да креирамо и изводимо операције над објектом нити. Класа Тхреад интерно имплементира интерфејс који се може покренути и такође проширује класу Објецт.
Следећа табела даје резиме различитих конструктора и метода класе Тхреад ().
Буилдер / | Прототип | Опис |
---|---|---|
спавати | јавно празно спавање (дуге милисекунде) | Извршење тренутне нити зауставља се на одређене милисекунде. |
Конструктор нити () | Тема () | Подразумевани конструктор за стварање објекта Тхреад. |
Тема (назив низа) | Конструктор за креирање Тхреад објекта са наведеним именом. | |
Навој (изводљиви р) | Направите инстанцу Тхреад са наведеним објектом интерфејса који се може изводити. | |
Тема (Руннабле р, назив низа) | Креирајте инстанцу Тхреад са наведеним објектом интерфејса који се може покренути и датим именом | |
трцати | јавна воид вожња () | Метод покретања изводи акцију за нит. Призива нит. |
почетак | јавни воид старт () | Користи се за започињање извршења нити. Интерно ЈВМ позива методу рун () на овој нити. |
придружити | јавно празно придруживање () | Сачекајте да нит умре |
јавно воид придруживање (дуге милисекунде) | Сачекајте одређене милисекунде да нит умре. | |
гетПриорити | јавни инт гетПриорити () | Врати приоритет нити |
сетПриорити | јавни инт сетПриорити (инт приоритет) | Промените приоритет нити у задати приоритет |
гетНаме | јавни Стринг гетНаме () | врати име нити. |
сетНаме | јавна празнина сетНаме (назив низа) | Поставите име нити на наведени низ |
цуррентТхреад | публиц Тхреад цуррентТхреад () | Враћа референцу нити која је тренутно активна |
гетИд | јавни инт гетИд () | Повратна нит Ид |
гетСтате () | публиц Тхреад.Стате гетСтате () | Даје тренутно стање нити |
је жив | јавни боолеан исАливе () | Проверите да ли је нит жива и вратите труе ако да. |
принос | принос јавне празнине () | Привремено зауставља тренутну нит и омогућава извршавање других нити. |
исДаемон | јавни боолеан исДаемон () | Проверите да ли је нит даемон нит; врати тачно ако је одговор да. |
сетДаемон | јавна воид сетДаемон (логичка б) | Поставите нит као демон тему ако је б = труе; иначе постављен као нит корисника. |
прекидати | јавни прекид празнине () | Прекини тренутну нит. |
исИнтерруптед | јавни боолеан исИнтерруптед () | Проверите да ли је нит прекинута. |
прекинут | јавна статичка логичка вредност прекинута () | Проверите да ли је тренутна нит прекинута. |
думпСтацк | Статички воид думпСтацк () | Штампа траг стека тренутне нити у стандардни ток грешке. |
обуставити | суспендовање јавне празнине () | Обуставља све нити. (** метода је застарела у најновијим верзијама Јава) |
Резиме | јавни воид животопис () | Наставите суспендовану нит. (** метода је застарела у најновијим верзијама Јава) |
зауставити | јавна воид стоп () | Зауставља нит. (** метода је застарела у најновијим верзијама Јава) |
Ове методе нити ћемо детаљно разрадити у нашем следећем водичу о мултитхреадинг-у.
Покретање нити
Метода старт () која се користи за покретање нити изводи следеће кораке:
- Покреће нову инстанцу нити са новим ЦаллСтацк-ом.
- Стање нити се мења из новог у изводљиво.
- Када је ред на нити, извршава методу рун ().
Имплементација интерфејса „Руннабле“
Примерак нити се такође може креирати помоћу интерфејса Руннабле. Да би се створила инстанца нити, класа чији објекти треба да се извршава помоћу нити треба да имплементира интерфејс који се може изводити.
Интерфејс Руннабле има само један метод:
ручно тестирање питања и одговори на интервјуу пдф
public void run () => this method is used to execute the thread.
Пример класе теме
Сада демонстрирајмо нит у Јави помоћу класе нити.
//class inherited from 'Thread' class ThreadClassDemo extends Thread { private int number; //class constructor public ThreadClassDemo(int number) { this.number = number; } //run method => execution code for thread public void run() { int counter = 0; int numInt = 0; //prints the number till specified number is reached, starting from 10 do { numInt = (int) (counter + 10); System.out.println(this.getName() + ' prints ' + numInt); counter++; } while(numInt != number); System.out.println('** Correct! ' + this.getName() + 'printed ' + counter + ' times.**'); } } public class Main { public static void main(String () args) { System.out.println('Starting thread_1...'); //create a thread class instance Thread thread_1 = new ThreadClassDemo(15); //start the thread thread_1 thread_1.start(); try { //wait for thread_1 to die thread_1.join(); } catch (InterruptedException e) { System.out.println('Thread interrupted.'); } System.out.println('Starting thread_2...'); Thread thread_2 = new ThreadClassDemo(20); //start thread_2 thread_2.start(); System.out.println('main() is ending...'); } }
Оутпут
Јава нит која користи покренути интерфејс
Следећи пример приказује употребу интерфејса Руннабле за креирање инстанце нити.
//class implements Runnable interface class RunnableDemo implements Runnable { private String message; //class constructor public RunnableDemo(String message) { this.message = message; } //run method public void run() { while(true) { System.out.println(message); } } } public class Main { public static void main(String () args) { //create first thread instance hello Runnable hello = new RunnableDemo('Hello, Greetings!!!'); Thread thread1 = new Thread(hello); thread1.setDaemon(true); //set this thread as daemon thread1.setName('hello'); System.out.println('Starting First thread...'); //start the thread thread1.start(); //create second thread instance bye Runnable bye = new RunnableDemo('Bye for now!!'); Thread thread2 = new Thread(bye); thread2.setPriority(Thread.MIN_PRIORITY); //set priority to min thread2.setDaemon(true); //set as daemon thread System.out.println('Starting goodbye thread...'); //start the thread thread2.start(); System.out.println('main() is ending...'); } }
Оутпут
Како зауставити нит у Јави
Видели смо примере нити горе. Из ових примера знамо да када метода извођења заврши извршење, нит се зауставља или се такође зауставља због неких изузетака.
Раније верзије Јава имале су стоп () методу у класи Тхреад која се могла користити за директно заустављање нити. Али сада је застарео из безбедносних разлога. Стога морамо да користимо друге методе како бисмо зауставили нит која се извршава.
Постоје две методе које можемо користити да зауставимо нит.
- Коришћење променљиве логичке променљиве
- Коришћење прекида.
У овом одељку ћемо размотрити оба ова начина заустављања нити.
Коришћење волатилне логичке променљиве
У овој методи одржавамо логичку променљиву саи флаг, да зауставимо нит. Нит се изводи све док је логичка променљива постављена на тачно. У тренутку када постане лажно, нит се зауставља.
Посебност ове методе је што логичку променљиву декларишемо као „ испарљив ”Тако да се увек чита из главне меморије и програм не може да га кешира у кешу процесора. На тај начин неће бити разлике у постављеним и очитаним вредностима.
Примена заустављања нити помоћу испарљиве логичке променљиве приказана је у наставку.
class StopThread extends Thread { private volatile boolean stop_flag = true; //initially set to true public void stopRunning() { stop_flag = false; //set stop_flag to false } @Override public void run() { while (stop_flag) { //keep checking value of stop_flag System.out.println('Thread is running...'); } System.out.println('Thread stopped!!!'); } } public class Main { public static void main(String() args) { //create a thread instance StopThread stop_thread = new StopThread(); //start the thread stop_thread.start(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //call stopRunning() method to stop the thread stop_thread.stopRunning(); } }
Оутпут
Белешка: Овде смо приказали само део резултата. Нит може да ради неколико минута пре него што се заустави. Тако да можемо добити различите резултате на различитим системима.
Коришћење прекида
Овде се нит зауставља помоћу методе интеррупт () као што смо већ расправљали горе у методама класе нити. Метода интеррупт () поставља статус нити као прекинуту. Овај статус се преноси у вхиле петљу методе рун (). Статус прекида можемо добити помоћу методе интерруптед ().
Следећи програм показује употребу методе интеррупт () за заустављање нити.
class StopThread extends Thread { @Override public void run() { while (!Thread.interrupted()) { //check for interrupted status System.out.println('Thread is running...'); } System.out.println('Thread stopped!!!'); } } public class Main { public static void main(String() args) { //create a thread instance StopThread stop_thread = new StopThread(); //start the thread stop_thread.start(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //interrupt the thread stop_thread.interrupt(); } }
Оутпут
Често постављана питања
П # 1) Зашто користимо Мултитхреадинг у Јави?
Одговор: Мултитхреадинг омогућава истовремено или истовремено извршавање две или више нити у апликацији. Истовремено извршавање максимизира проток и такође користи ЦПУ на максимум.
П # 2) Шта је Мултитхреадинг? Које су његове врсте?
Одговор: Мултитхреадинг значи извршавање више нити. Ово извршавање може бити истовремено или паралелно. Дакле, вишенитност има два типа, тј. Истовремено или паралелно.
П # 3) Шта је Мултитхреадинг вс Мултипроцессинг?
Одговор: У мултитхреадинг-у постоји више нити за исте или различите процесе и те нити се извршавају истовремено да би се побољшала рачунска брзина система. У вишепроцесирању систем има више од два ЦПУ-а и више процеса се извршава истовремено.
П # 4) Које су предности Мултитхреадинг-а у Јави?
Одговор: Коришћењем мултитхреадинга можемо истовремено извршавати различите делове апликације користећи нити. Мултитхреадинг повећава пропусност система. Мултитхреадинг такође максимизира употребу ЦПУ-а јер различите нити континуирано користе ЦПУ.
П # 5) Да ли је мултитхреадинг добар за игре на срећу?
Одговор: Да, посебно за модерне игре.
Закључак
Овде се све ради о увођењу мултитхреадинга. У овом упутству смо разговарали о паралелности и вишеструком увођењу нити у Јави. Разговарали смо о стварању нити са Тхреад класом, као и са Руннабле интерфејсом, и пружили смо одговарајуће примере.
Такође смо детаљно научили концепте једне нити и њено стварање. Концепти нити, укључујући животни циклус нити, заустављање нити, врсте нити итд. Разматрани су у овом водичу.
Такође смо разговарали о мултитреадингу на дужи рок и паралелности у Јави. На крају овог водича, читалац би требао бити у могућности да лако схвати концепте истовремености и вишеструкости, као и нити у Јави.
=> Овде припазите на једноставну серију Јава тренинга.
Препоручено читање
- Мултитхреадинг у Ц ++ са примерима
- Јава теме са методама и животним циклусом
- Тхреад.Слееп () - Метода спавања нити () у Јави са примерима
- Водич за ЈАВА за почетнике: 100+ практичних Јава видео водича
- Водич за Јава рефлексију са примерима
- Јава Стринг садржи () Водич за методе са примерима
- Назубљени низ у Јави - Водич са примерима
- Водич за класу Јава Сцаннер са примерима