Посматрајмо неке друге разлике између Тхреад и Руннабле уз помоћ табеле за упоређивање приказане испод:
Цомпарисон Цхарт
Основа за поређење | Тхреад | Руннабле |
---|---|---|
Басиц | Свака нит креира јединствени објекат и придружује му се. | Вишеструке нити дијеле исте објекте. |
Меморија | Како свака нит креира јединствени објекат, потребно је више меморије. | Пошто више нити дели исти објекат, користи се мање меморије. |
Проширење | У Јави, вишеструко наслеђивање није дозвољено, стога, након што класа прошири класу Тхреад, она не може проширити ниједну другу класу. | Ако класа дефинише нити која имплементира Руннабле интерфејс, има шансу да прошири једну класу. |
Користи | Корисник мора проширити класу нит само ако жели да поништи друге методе у класи Тхреад. | Ако желите само да специјализујете начин извођења, онда је имплементација Руннабле боља опција. |
Квачило | Проширена класа Тхреад уводи уску везу, јер класа садржи код Тхреад класе и такође задатак који је додељен нити | Имплементација Руннабле интерфејса уводи лоосе цоуплинг јер је код Тхреад одвојен од посла Тхреадс. |
Дефиниција класе Тхреад
Тема је класа у јава.ланг пакету. Класа Тхреад проширује Објецт класу и имплементира Руннабле интерфејсе. Класа Тхреад има конструкторе и методе за креирање и рад на нити. Када креирамо више нити, свака нит креира јединствени објекат и повезује се са тим објектом. Ако креирате Тхреад класу која проширује нити, даље не можете проширити ниједну другу класу јер јава не подржава вишеструко наслеђивање. Дакле, требало би да изаберете да проширите класу Тхреад само када желите да надјачате и неке друге методе Тхреад класе. Погледајмо примјер стварања нити која проширује Тхреад класу.
/ * Дефинисање нити * / Класа Митхреад протеже се Тхреад {/ * посао конца * / публиц воид рун () {фор (инт и = 0; и <10; и ++) {Систем.Оут.Принтлн ("Цхилд Тхреад") ); }} Цласс маинТхреад {/ * работа главној нит * / публиц статиц воид маин (Стринг аргс []) {Митхреад мт = нев Митхреад (); / * главна нит креирала дете тхреад * / мт.старт (); фор (инт и = 0; и <10; и ++) {Систем.Оут.Принт ("Маин Тхреад"); }}} / * Оутпут * / Маин Тхреад Главна нит Главна нит Главна нит Главна нит Главна нит Главна нит Тема за децу Тема за децу Главна нит Главна нит Тема за децу Тема за децу Главна нит
У горњем коду, креирам класу Митхреад која проширује Тхреад класу и надјачава методу рада Тхреад класе. У класи која садржи главни метод креирам објекат нити (мт) класе Митхреад и користим објекат тхреад који је позвао старт () методу. Метод старт покреће извршење нити и истовремено ЈВМ позива методу извођења нити. Сада постоје два нити у програму једна главна нит и други дечји низ креиран од стране главне нити. Извођење оба навоја се одвија истовремено, али се точан излаз не може претварати.
Дефиниција Руннабле Интерфаце-а
Руннабле је интерфејс у јава.ланг пакету. Имплементацијом Руннабле интерфејса можемо дефинисати нит. Руннабле интерфејс има једну методу рун (), коју имплементира класа која имплементира Руннабле интерфејс. Када изаберете да дефинишете нити која имплементира Руннабле интерфејс, још увек имате избор да проширите било коју другу класу. Када креирате више нити имплементирајући Руннабле интерфејс, свака нит дели исту извршну инстанцу. научимо како да дефинишемо нити помоћу Руннабле интерфејса.
/ * Дефинисање нити * / Класа Руннаблетхреад имплементира Руннабле {/ * задатак нити * / публиц воид рун () {фор (инт и = 0; и <10; и ++) {Систем.Оут.Принтлн ("Цхилд Тхреад") ); }} Цласс маинТхреад {/ * работа главној нит * / публиц статиц воид маин (Стринг аргс []) {Митхреад рт = нев Митхреад (); / * главна нит креирала објекат који се може извршити * / Тхреад т = нев Тхреад (рт); / * главна нит ствара дете нит и прослеђује објекат који се може извршити * / т.старт (); фор (инт и = 0; и <10; и ++) {Систем.Оут.Принт ("Маин Тхреад"); }}} / * Оутпут * / Маин Тхреад Главна нит Главна нит Главна нит Главна нит Главна нит Главна нит Тема за децу Тема за децу Главна нит Главна нит Тема за децу Тема за децу Главна нит
У горњем коду, креирао сам класу Руннаблетхреад која имплементира Руннабле сучеље и дефинира посао нити имплементирањем рун () методе сучеља Руннабле. Затим креирам класу маинтхреад која садржи главни метод. Унутар главне методе, ја сам прогласио руннабле објект класе Руннаблетхреад и прослиједио овај објект конструктору Тхреад-а док је објављивао нит. На тај начин сам повезао објекат нити (т) са објектом који се може извршити (рт). Тада објекат нити покреће методу покретања нити која даље позива метод извршавања класе Руннаблетхреад. Ако нисам повезао објекат који се може извршити са објектом Тхреад, онда би метода старта нити покренула метод покретања класе Тхреад. Сада, опет постоје две нити у коду, главна нит и главна нит стварају дечји конац и истовремено се извршавају, али се тачан излаз никада не може претварати.
Кључне разлике између теме и Руннабле у Јави
- Свака нит створена проширењем Тхреад класе креира јединствени објекат за њу и добија се придружен том објекту. С друге стране, свака нит креирана имплементацијом Руннабле интерфејса дели исту руннабле инстанцу.
- Пошто је свака нит повезана са јединственим објектом када је креирана проширењем Тхреад класе, потребно је више меморије. С друге стране, свака нит створена имплементацијом Руннабле интерфејса дели исти простор објекта тако да захтева мање меморије.
- Ако продужите класу Тхреад онда даље, можете наслиједити било коју другу класу јер Јава не допушта вишеструко насљеђивање, док имплементирање Руннабле-а још увијек пружа прилику класи да наслиједи било коју другу класу.
- Мора се проширити Тхреад класа само ако мора надјачати или специјализирати неке друге методе Тхреад класе. Морате имплементирати Руннабле сучеље ако желите само специјализирати начин извођења.
- Проширивање Тхреад класе уводи уско повезивање у коду као што је код Тхреад и посао тхреад садржан у истој класи. С друге стране, Имплементинг Руннабле интерфејс уводи лабав спој у коду, јер је код Тхреад сепрате од посла који је додељен тхреаду.
Закључак:
Пожељно је имплементирати Руннабле сучеље умјесто проширења Тхреад класе. Како имплементација Руннабле чини ваш код лабаво спојеним јер је код тхреад-а различит од класе која додељује посао нити. Потребно је мање меморије и такође омогућава класи да наследи било коју другу класу.