Шта је ЕкецуторСервице у Јави и како га креирати?



Овај чланак покрива концепт извршног под-интерфејса ЕкецуторСервице у Јави са разним примерима који објашњавају стварање нити и управљање њима у Јави.

Програмски језик Јава веома ефикасно ради апликације које захтевају да се задаци извршавају истовремено у нити. Било којој апликацији постаје тешко да истовремено изврши велики број нити. Да би се превазишао овај проблем, долази са ЕкецуторСервице који је под-интерфејс . У овом чланку ћемо размотрити функционалност ЕкецуторСервице у Јави. Следе теме обрађене на овом блогу:

Шта је извршни оквир?

Прилично је лакше истовремено направити и извршити једну или две нити. Али постаје тешко када се број нити повећа на значајан број. Велике вишенитне апликације имаће стотине нити истовремено. Стога има потпуно смисла раздвојити стварање нити од управљања нитима у апликацији.





Извршитељ је а помаже вам у стварању и управљању нитима у апликацији. Тхе помаже вам у следећим задацима.

  • Стварање нити: Пружа разне методе за стварање нити које помажу у истодобном покретању апликација.



  • Управљање нитима: Такође управља животним циклусом нити. Не морате да бринете да ли је нит активна, заузета или мртва пре него што задатак предате на извршење.

  • Предавање и извршење задатка: Оквир извршитеља пружа методе за предавање задатака у спремишту нити, Такође даје моћ одлучивања да ли ће се нит извршити или не.

извршитељ услуга-извршитељ услуга у јави -едурека

ЕкецуторСервице у Јава примеру

То је под-интерфејс извршног оквира који додаје одређене функционалности за управљање животним циклусом нити апликације. Такође пружа метод субмит () који може прихватити и покренути и позивни предмета.



У следећем примеру ћемо створити ЕкецуторСервице са једном нити, а затим предати задатак који треба извршити унутар нити.

импорт јава.утил.цонцуррент.ЕкецуторСервице импорт јава.утил.цонцуррент.Екецуторс публиц цласс Пример {публиц статиц воид маин (Стринг [] аргс) {Систем.оут.принтлн ('Инсиде:' + Тхреад.цуррентТхреад (). гетНаме ( )) Систем.оут.принтлн ('стварање ЕкецуторСервице') ЕкецуторСервице екецуторсервице = Екецуторс.невСинглеТхреадЕкецутор () Систем.оут.принтлн ('стварање руннабле') Руннабле руннабле = () -> {Систем.оут.принтлн ('унутра: '+ Тхреад.цуррентТхреад (). ГетНаме ())} Систем.оут.принтлн (' предати задатак наведен изводивим извршном сервису ') екецуторсервице.субмит (руннабле)}}
 Излаз: Унутра: главно креирање ЕкецуторСервице креирање покренуте датотеке, предајте задатак наведен изводљивом извршној служби изнутра: поол-1-тхреад-1

Изнад показује како можемо створити ЕкецуторСервице и извршити задатак унутар извршиоца. Ако се задатак преда на извршење, а нит је тренутно заузета извршавањем другог задатка, тада ће задатак сачекати у реду док нит не буде слободна да га изврши.

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

Имплементације Јава ЕкецуторСервице

ЕкецуторСервице је веома сличан спремишту нити. У ствари, имплементација ЕкецуторСервице у јава.утил.цонцуррент пакет је имплементација скупа нити. ЕкецуторСервице има следеће примене у пакету јава.утил.цонцуррент:

ТхреадПоолЕкецутор

ТхреадПоолЕкеецутер извршава дате задатке користећи једну од својих интерно удружених нити.

Креирање нитиПоолЕкецутор

инт цореПоолСизе = 5 инт макПоолСизе = 10 лонг кеепАливеТиме = 5000 ЕкецуторСервице тхреадПоолЕкецутор = нев тхреадПоолЕкецутор (цореПоолСизе, макПоолСизе, кеепАливеТиме, ТимеУнит.МИЛЛИСЕЦОНДС, нови ЛинкедБлоцкингКуеуе ())

СцхедуледТхреадПоолЕкецутор

Јава.утил.цонцуррент.СцхедуледТхреадПоолЕкецутор је ЕкецуторСервице који може планирати извршавање задатака након кашњења или извршавање у више наврата са одређеним временским интервалом између сваког извршења.

Пример

СцхедуледЕкецуторСервице сцхедуледекецуторсервице = Екецуторс.невСцхедуледТхреадПоол (5) СцхедуледФутуре распоредфутуре = распоредЕкецуторСервице.сцхедуле (нови Цаллабле () {јавни позив објекта () баца изузетак {Систем.оут.принтлн ('извршено')) ',' извршено ')', 'извршено'). СЕКУНДЕ)

ЕкецуторСервице Употреба

Постоји неколико различитих начина за делегирање задатака извршној служби.

  • извршити (покренути)

  • пошаљи (може се покренути)

  • инвокеАни ()

  • инвокеАлл ()

Извршити Руннабле

Извршење Јава ЕкецуторСервице (Руннабле) узима објект јава.ланг.Руннабле и извршава га асинхроно.

ЕкецуторСервице екецуторСервице = Екецуторс.невСинглеТхреадЕкецутор () екецуторСервице.екецуте (нев Руннабле () {публиц воид рун () {Систем.оут.принтлн ('асинхрони задатак')}}) екецуторСервице.схутдовн ()

Не постоји начин да се добије резултат извршења Руннабле, за то морате користити Цаллабле.

Субмит Руннабле

Јава ЕкецуторСервице субмит (Руннабле) метода узима Руннабле имплементацију и враћа будући објекат. Будући објекат се може користити за проверу да ли је Руннабле завршио извршење.

Будућност = екецуторСервице.субмит (нев Руннабле () {публиц воид рун () {Систем.оут.принтлн (: асинхрони задатак ')}}) футуре.гет () // враћа нулу ако је задатак правилно завршен.

Пошаљи Цаллабле

Метода слања Јава (ЕкецуторСервице) (Цаллабле) је слична подношењу (Руннабле), али уместо Руннабле-а узима Јава Цаллабле.

Будућност = екецуторСервице.субмит (нев Цаллабле () {публиц Објецт цалл () баца изузетак {Систем.оут.принтлн ('Асинхрони позивни') ретурн 'Цаллабле Ресулт'}}) Систем.оут.принтлн ('футуре.гет ( ) = 'футуре.гет ())
 Излаз: Асинхрони позивљиви будући.гет = Резултат који се може позвати

инвокеАни ()

Метода инвокеАни () узима колекцију објеката који се могу позивати. Позивање ове методе не враћа било какву будућност, већ враћа резултат једног од објеката који се могу позвати.

ЕкецуторСервице екецуторСервице = Извршитељи.невСинглеТхреадЕкецутор () Сетцаллаблес = нови ХасхСет() цаллаблес.адд (нови Цаллабле () {јавни позив низа () баца изузетак {ретурн'таск А '}}) цаллаблес.адд (нови Цаллабле () {јавни позив низа () баца изузетак {ретурн'таск Б'} }) цаллаблес.адд (нев Цаллабле () {публиц Стринг цалл () баца изузетак {ретурн'таск Ц '}}) Стринг ресулт = екецуторСервице.инвокеАни (цаллаблес) Систем.оут.принтлн (' ресулт = '+ ресулт) екецуторСервице .искључити()

Када покренете горњи код, резултат се мења. То може бити задатак А, задатак Б и тако даље.

ИнвокеАлл ()

Метода инвокеАлл () позива све Цаллабле објекте прослеђене као параметре. Враћа будуће објекте који се могу користити за добијање резултата извршавања сваког позива.

ЕкецуторСервице екецуторСервице = Извршитељи.невСинглеТхреадЕкецутор () Сетцаллаблес = нови ХасхСет() цаллаблес.адд (нев Цаллабле () {публиц Стринг цалл () баца изузетак {ретурн 'Таск А'}}) цаллаблес.адд (нев Цаллабле () {публиц Стринг цалл () баца изузетак {ретурн 'Таск Б'}) }) цаллаблес.адд (нев Цаллабле () {публиц Стринг цалл () баца изузетак {ретурн 'Таск Ц'}}) Листфутурес = екецуторСервице.инвокеАлл (цаллаблес) фор (Будућа будућност: футурес) {Систем.оут.принтлн ('футуре.гет =' + футуре.гет ())} екецуторСервице.схутдовн ()

Руннабле вс Цаллабле

Интерфејси који се могу покренути и који се могу позвати веома су слични једни другима. Разлика је видљива у декларацији интерфејси. Оба интерфејса представљају задатак који се може истовремено извршавати помоћу нити или ЕкецуторСервице.

Изјава која се може позвати:

јавни интерфејс Цаллабле {позив јавног објекта () баца изузетак}

Изјава о трчању:

јавни интерфејс Изводљив {публиц воид рун ()}

Главна разлика између ове две методе је што метода цалл () може да врати објекат из позива методе. А метода цалл () може да баци док метода рун () не може.

јава шта чини додатак

отказати задатак

Задатак који сте предали ЕкецуторСервице можете отказати једноставним позивањем методе поништавања на будући поднети када се задатак преда.

футуре.цанцел ()

Искључење услуге извршитеља

Да бисте спречили покретање нити чак и након завршетка извршења, требали бисте искључити ЕкецуторСервице.

искључити()

Да бисте прекинули нити унутар ЕкецуторСервице, можете позвати методу схутдовн ().

екецуторСервице.схутдовн ()

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

Ако сматрате да је овај чланак о „ЕкецуторСервице ин Јава“ релевантан, погледајте поуздана компанија за учење на мрежи са мрежом од више од 250.000 задовољних ученика раширених широм света.

Овде смо да вам помогнемо у сваком кораку на путовању и осмислимо наставни план и програм који је дизајниран за студенте и професионалце који желе да буду програмери Јава. Курс је дизајниран да вам пружи почетну предност у Јава програмирању и обучи вас за основне и напредне Јава концепте, заједно са разним као Хибернате & .

Ако наиђете на неко питање, слободно поставите сва своја питања у одељку за коментаре „ЕкецуторСервице ин Јава“ и наш тим ће вам радо одговорити.