Ве најмуваат од државната градинка „Весела Пролет“, да имплементирате софтвер кој автоматски ќе гo контролира присуството на воспитувачките во однос на децата во градинката и ќе направи распределување на воспитувачи-деца.
Во градинката има правило дека секогаш мора има еден присутен воспитувач за најмногу три деца.
Во почетниот код кој е даден, дефинирани се класите Adult и Child, кои ги симболизираат воспитувачките и децата од градинката.
Во имплементацијата, можете да ги користите следните методи од веќе дефинираната променлива state:
state.adultEntered() - Го симболизира влегувањето на воспитувач во градинката. state.adultLeft() - Го симболизира излегувањето на воспитувач од градинката. state.adultLeaving() - Симболизира состојба на чекање на воспитувачот за да излезе од градинката. state.childrenEntered() - Го симболизира влегувањето на дете во градинката. state.childLeft() - Го симболизира излегувањето на дете од градинката. state.childEntering() - Симболизира состојба на чекање на дете за да влезе од градинката.
Се користат семафори и бројачи по желба. Тие треба да се дефинираат на почетокот од класата и треба да се static. Се иницијализираат во методот init().
Вашата задача е да ги имплементирате методите Child.execute(), Adult.execute() и init(). При имплементацијата, не смеете да додадете try-catch блок во нив. Потребните семафори, глобални променливи и променливи за состојбата треба да ги дефинирате самите.
Доколку имате грешка, ќе ја добиете пораката:
Procesot ne e sinhroniziran spored uslovite na zadacata.
По што ќе ви се прикаже логот на повикување на акциите и настанатите грешки. Овој лог треба да ви послужи за увидување на тоа каде имате грешка во извршувањето на вашата задача.
Напомена: Поради конкурентниот пристап за логирањето, можно е некои од пораките да не се на позицијата каде што треба да се. Токму затоа, овие пораки користете ги само како информација, но не се ослонувајте на нив.
Некаде во националниот парк Кругер во Јужна Африка има голем кањон. Двете страни на кањонот ги спојува јаже. Бабуните можат да го преминат кањонот користејќи го јажето.
Доколку два бабуни кои одат во спротивни насоки се сретнат тогаш ќе настане борба и двата бабуни ќе паднат од јажето. Јажето може да издржи највеќе пет бабуни во исто време. Ако има повеќе од пет бабуни во даден момент, јажето ќе се скине.
Да претпоставиме дека може да ги научиме бабуните да користат семафори. Потребно е да се напише решение за синхронизација кое ќе ги задоволи следниве услови:
- Откако еден бабун ќе се качи на јажето, тој треба да помине безбедно на другата страна без притоа да се сретне со некој друг бабун од спротивната насока.
- На јажето во исто време може да има највеќе пет бабуни.
- Група бабуни кои минуваат во една насока не треба да го спречат минувањето на бабуните од спортивна насока, т.е тие не треба да чекаат бесконечно. (Проблем на изгладнување)
Да претпоставиме дека кањонот има две страни, лева и десна. Во решението мора да се искористат неколку методи кои ќе ја дефинираат состојбата.
- state.leftPassing() и state.rightPassing() се повикуваат за да се назначи дека јажето моментално ќе го користат само бабуните кои минуваат од соодветната страна.Доколку бабуните од лева страна го започнат нивното минување, првиот бабун од групата е должен да го повика методот state.leftPassing(). **Напомена**: Овој метод го повикува само првиот бабун од соодветната страна. Методот се повикува секогаш кога ќе настане промена во насоките на движење. - state.cross(this) методот се повикува кај секој од бабуните (вклучувајќи го и првиот). Овој метод означува дека бабунот го започнал неговото изминување на јажето. - state.leave(this) методот се повкува кај секој од бабуните откако бабунот ќе премине на другата страна на каноњот.Starter File Solution File
N филозофи седат на кружна маса. Пред секој филозоф се наоѓа порција тестенини, а помеѓу секоја порција се наоѓа по една вилушка.
Секој филозоф го поминува времето во јадење и размислување. За филозофот да може да почне да јаде, потребно е да ги држи обете вилушки кои се наоѓаат до неговата порција, што значи дека два соседни филозофи не можат да јадат истовремено бидејќи при тоа би користеле иста вилушка.
Може да се смета дека проциите не се трошат, т.е. овозможуваат бесконечен број оброци. За конзумирање еден оброк на филозофот му е потребно конечно време, по што истиот почнува да размислува за по некое време повторно да сака да јаде.
Потребно е да се пронајде алгоритам кој ја максимизира истовременоста на јадењето на филозофите и не дозволува филозоф да изгладнува.
Одбрано е едно1 од предложените решенија на Edsger W. Dijkstra именувано „Resource hierarchy solution“2, т.е. решение со формирање хиерархија на ресурси.
Алгоритмот нуди сигурност дека нема да се случи блокада или изгладнување.
Се врши подредување на вилушките со користење на правилото: секој филозоф се обидува да ја земе вилушката со помал реден број, а откако ќе ја добие, се обидува да ја земе вилушката со поголем реден број.
Коректноста на решението може да се согледа преку пример. Нека N = 5 – пет филозофи, пет порции и пет вилушки. Филозофите и вилушките се означуваат со броеви од 1 до 5 така што вилушката 1 се наоѓа оддесно на филозофот 1.
Нека сите филозофи почнат да јадат одеднаш. Филозофот 1 ја зема вилушката 1 и чека да ја добие вилушката 2 која истовремено ја земал филозофот 2. Вториот филозоф чека да ја добие вилушката 3 која веќе ја земал филозофот 3, кој чека да ја добие четвртата вилушка земена од филозофот 4.
Поради подредувањето на вилушките, филозофот 5 нема да посегне по вилушката 5 бидејќи најпрво му е потребна вилушката 1, што придонесува истиот да чека првиот филозоф да заврши со оброкот и да ја остави потребната вилушка.
Филозофот 4 може да ја земе вилушката 5 и веднаш да почне со оброкот, а откако ќе заврши, да ги остави двете вилушки на масата, со што филозофот 3 ќе може веднаш да почне да јаде.
На истиот начин, филозофите означени со броевите 3, 2 и 1 ќе завршат со оброкот, а по тоа филозофот 5 ќе може да ја добие вилушката 1, а потоа и вилушката 5.
Класата DiningPhilosophers дефинира класа Philosopher која претставува филозоф и го имплементира претходно опишаното решение. Класата содржи референци кон вилушките, кои на истиот му се доделени согласно со решението.
Пред да започне да јаде, филозофот чека да ја добие вилушката со помал реден број, а потоа онаа со поголем. Откако ќе заврши со оброкот и ќе ги остави вилушките, тој почнува да размислува.
DiningPhilosophers класата содржи N семафори кои ги претставуваат вилушките на масата. Секој семафор е поддесен да пропушта само една нишка - една вилушка истовремено може да ја користи само еден филозоф.
main() методот го повикува run() методот само еднаш – доколку има потреба од повеќекратно извршување на методот, истото може да се симулира со промена на вредноста на една од следните променливи:
- DiningPhilosophers.NUMBER_OF_PHILOSOPHERS - број на филозофи.
- numRuns - број на извршувања на execute() методот на секој филозоф.
- numIterations - број на извршувања на решението, т.е. севкупниот број на маси на кои седат филозофи.
- step - вредноста на зголемувањето на бројот на филозофи на масата во секоја наредна итерација.
Ниту еден од следните настани не смее да се случи при извршување коректно решение:
1. Една вилушка се користи истовремено од повеќе од еден филозоф.
2. Блокада: состојба во која секој филозоф чека друг филозоф да ослободи вилушка.
3. Изгладнување: барем еден филозоф не успеал да ги земе двете вилушки.
4. Последователност: најголемиот број на филозофи кои јадат истовремено е 1.
Најважни методи во оваа класа се методите eat() и think() кои се повикуваат во `execute()` методот на `DiningPhilosophers.Philosopher` класата:
- eat() методот го имплементира процесот на јадење. Прво се забележува дека филозофот преминал во состојба „јадење“. Се проверува дали некој од соседите на овој филозоф тековно јаде, и во таков случај се забележува исклучок, бидејќи дошло до појава на настан 1. Се зголемува бројот на филозофи кои тековно јадат и нишката се суспендира одредено време со што е овозможено извршување друга нишка. Филозофот завршува со јадење кога тековната нишка ќе продолжи да се извршува, истиот се враќа во состојба „размислување“ и бројот на филозофи кои тековно јадат се намалува за еден. Се напоменува дека состојбата „размислување“ во овој контекст претставува комплемент на состојбата „јадење“, т.е. филозоф во состојба „размислување“ може да не размислува, туку да чека вилушка за одновно да почне да јаде. Едно извршување на eat() методот е аналогно на конзумирање оброк. - think() методот забележува дека филозофот преминал во состојба „размислување“ и ја суспендира нишката. - finalize() методот врши проверка за појава на настан 3 и 4 од листата. Нема потреба од посебна проверка за појава на настанот 2 бидејќи самата извршна околина го детектира. Поради начинот на забележување на исклучоците, при случување на блокада се бележи дека се случило изгладнување иако станува збор за вистинска блокада која е препознаена. Овој проблем може да се заобиколи доколку се коментира линијата код throw e; во logException() методот на `AbstractState` класата – во таков случај, се забележува грешка изгладнување и грешка блокада.Starter File Solution File
Се одржуваат неколку последователни церемониии во салата Фанел, на која присуствуваат три типа на посетители: доселеници, гледачи и судија.
Секој од трите типа посетители предизвикува неколку акции и тоа:
Доселениците влегуваат во салата, се пријавуваат, седнуваат на столче, ја кажуваат заклетвата, го земаат сертификатот и ја напуштаат салата. - enterImmigrant() - checkIn() - sitDown() - swear() - getCertificate() - leaveImmigrant() Гледачите влегуваат во салата, ја гледаат церемонијата и ја напуштаат салата. - enterSpectator() - spectate() - leaveSpectator() Судијата влегува во салата, ја потврдува натурализацијата и ја напушта салата. - enterJudge() - confirm() - leaveJudge()
Но постојат одредени правила на однесување за време на церемонијата.
Доселениците не смеат да влегуваат или да ја напуштаат салата доколку во неа е присутен судија.
Не е дозволено повеќе доселеници истовремено да се пријавуваат.
Во салата има неограничен број на столови на кои што доселениците можат да седнат и да чекаат судијата да ја потврди натурализацијата за да ја кажат заклетвата (**swear()** не смее да биде повикан од ниту еден доселеник пред да се повика **confirm()** од судијата).
Откако судијата ќе ја потврди натурализацијата, доселениците еден по еден ја кажуваат заклетвата и си го земаат сертификатот.
Гледачите не смеат да влезат во салата ако судијата е веќе внатре, но можат да ја напуштат салата во било кое време, ако не сакаат да чекаат да заврши церемонијата.
Истовремено во салата не може да има повеќе судии. Првиот судија може да влезе во било кое време, но останатите мора да чекаат целосно да заврши церемонијата, односно сите доселеници кои биле дел од церемонијата да ја напуштат салата (тоа не значи дека во салата нема други доселеници кои ја чекаат следната церемонија).
Присутниот судијата мора да ги почека сите доселеници кои што веќе се внатре во салата да се пријават за да ја потврди натурализацијата (Судијата не може да го повика confirm() ако претходно не е повикан checkIn() од сите доселеници кои повикале enterImmigrant()).
*Сите методи се повикуваат точно во редоследот во кој се напишани во соодветните execute методи на класите Immigrant, Judge и Spectator.*
Hilzer’s Barbershop Probleм претставува покомплицирана верзија на класичниот проблем на берберница (Barbershop Problem).
Во овој проблем берберницата има повеќе столчиња за потстрижување (исто колку и бербери), повеќе бербери (но не повеќе од 15) и просторија за чекање која се состои од една софа на која може да се сместат најмногу 4 клиенти и простор за стоење. Ограничувањата се дека во берберницата не смее во ниеден момент да има повеќе од 20 клиенти (ова ги вклучува столчињата, софата и просторот за стоење). Од ова ограничување произлегува и ограничувањето за берберите и столчињата, бидејќи секој клиент мора прво да чека стоечки, па да чека седечки, па да оди на столчето за потстрижување, па ако ставиме повеќе од 15 бербери ќе нема место за стоење.
Клиент не смее да влезе во берберницата ако нејзиниот капацитет е исполнет (внатре веќе има 20 клиенти).
Откако ќе влезе, клиентот стои додека да се ослободи место на софата (да има помалку од 4 клиенти на софата).
Кога некој бербер е слободен, еден од клиентите (не е важно кој) кои седат на софата се префрлува на неговото столче за потстрижување и му сигнализира на берберот дека тој е спремен за потстрижување.
Во овој момент ако има клиенти кои стојат, еден од нив (не е важно кој) седнува на софата.
Кога некој од клиентите е готов со потстрижувањето тој плака кај било кој од берберите (немора кај тој што го потстрижувал). Повеќе клиенти може да плаќаат во исто време.
Берберите своето време го делат помегу: потстрижување, наплаќање и чекање да дојде клиент на нивото столче.
Со други зборови, следниве ограничувања треба да важат при синхронизацијата:
+ Клиентите ги повикуваат следниве функции и тоа стрикно во овој редослед: enterShop(), sitOnSofa(), sitInBarberChair(), getHairCut(), pay(), exitShop().
+ Берберите ги повикуваат: cutHair(), acceptPayment().
- enterShop() + Секој клиент ја повикува при влез во берберницата. + Клиентите не може да ја повикаат enterShop ако капацитетот на берберницата е исполнет. --- - sitOnSofa() + Секој клиент ја повикува при седнување на софата. + Највеќе 4 клиенти можат да седат на софата истовремено. + Ако капацитетот на софата е полн, клиент којшто пристигнал не може да ја повика sitOnSofa() додека еден од клиентите на софата не ја повика sitInBarberChair(). --- - sitInBarberChair() + Секој клиент ја повикува при седнување на берберскиот стол. + Ако сите бербер(и) се зафатени, клиентот не може да ја повика **sitInBarberChair** додека еден од клиентите кои се потстрижуваат не ја повика exitShop(). --- - getHairCut() + Секој клиент ја повикува по седнувањето на берберскиот стол. + Мора да биде повикана пред берберот да ја повика cutHair(). --- - pay() + Секој клиент ја повикува откако ке биде потстрижан. + Клиентот мора да ја повика pay пред берберот да ја повика acceptPayment. + Клиентот не може да ја повика exitShop() пред да плати. --- - exitShop() + Секој клиент мора да бил потстрижан пред да може да излезе. + Берберот мора да ја повика acceptPayment пред клиентот да ја повика exitShop. --- --- - cutHair() + Секој бербер ја повикува кога ќе има присутен клиент на некој од столовите. + Клиентот мора да ја повикал getHairCut() пред да биде повикана оваа функција. --- - acceptPayment() + Секој бербер ја повикува по потстрижувањето на клиент. + Клиентот мора да ја повикал pay() пред да биде повикана оваа функција. ---
Ниедна од функциите не смее да се повика повеќе од еднаш и вон дадениот редослед.
Се користат семафори и бројачи по желба. Тие треба да се дефинитат на почетокот од класата и треба да се static.
Се иницијализираат во методот init().
Треба да се имплементираат методите execute() во секоја од двете класи (Barber и Customer) користејќи ги претходно споменатите методи.
Не смеат да се користат try-catch блокови во execute() методите.
Некаде близу Редмонд, Вашингтон, има брод кој го користат Linux хакерите (hackers) и вработените во Microsoft (serfs), за премин на реката за да стигнат на работното место.
Бродот се дивижи од едната на другата страна на реката ако и само ако на него се качат точно четворица патници.
Поради големото ривалство на вработените од двете компании, не е дозволено на бродот да има еден вработен од едната и тројца вработени од другата компанија.
Сите други комбинации се дозволени. Од таа причина, ве изнајмуваат вас да направете софтвер кој ќе го регулира преминот на реката.
Во почетниот код кој е даден, дефинирани се класите Hacker и Serf.
Од секоја од класите паралелно се активни повеќе инстанци кои на бродот може да се качат само еднаш.
Во имплементацијата мора да ги искористите следните методи од веќе дефинираната променлива state:
- state.board() - секој вработен кој се качува на бродот ја повикува оваа функција, - треба да гарантирате дека секој од четирите патници кои се качуваат на бродот го има повикано овој метод пред да биде повикан методот rowboat(). - state.rowBoat() - методот треба да биде повикан откако претходно сите четири патници го повикале методот board() - треба да гарантирате дека методот ќе биде повикан само од еден од четворицата патници, независно од кој. Вашата задача е да ги имплементирате методите: Hacker.cross() Serf.cross() init().
При имплементацијата не смеете да користите try-catch блокови во нив. Потребните семафори и глобални променливи треба да ги дефинирате самите.
Доколку имате грешка, ќе ја добиете пораката:
Procesot ne e sinhroniziran spored uslovite na zadacata.
После пораката ќе ви се прикаже логот на повикување на акциите и настанатите грешки.
Овој лог треба да ви послужи за увидување на тоа каде имате грешка во извршувањето на вашата задача.
Напомена:
Поради конкурентниот пристап за логирањето, можно е некои од пораките да не се на позицијата каде што треба да се. Токму затоа, овие пораки користете ги само како информација, но не се ослонувајте на нив.
Да претпоставиме дека имаме n нишки на патници и една нишка на кола.
После секое возење патниците повторно чекаат ред за да се возат со колата, која може да
вози само со точно 10 патници, каде 10 < n.
- Патниците треба да повикаат board() и unboard()
- Колата треба да повика load(), run() и unload()
- Патниците неможе да се качуваат пред колата да повика load()
- Колата неможе да го започне возењето ( run() ) се додека 10 патници не повикаат board()
- Патниците неможе да повикаат unboard() пред колата да повика unload()
- На крај од секое возење треба да се повика методот validate() само еднаш со цел да се провери дали колата е целосно празна и завршила со возење
Колата ги повикува методите: - load() метода со која се обезбедува една кола потребна за возење, патниците неможат да се качуваат во колата board() пред да се повика овој метод. - run() метода која се повикува откако ќе има точно 10 патници во колата. - unload() метода со која се ослободува колата за следно возење, патниците неможат да излегуваат од колата unboard() доколку пред тоа не е повикан овој метод. Патникот ги повикува методите: - board() метода со која патниците влегуваат во колата, која неможе да се повика доколку предходно не е повикано load(). - unboard() метода со која патниците излегуваат од колата, која неможе да се повика доколку предхнодно не е повикано unload()Starter File Solution File
The Party Room Problem започнува од деканот кој има потреба да ја пребара собата на студентите. Има неколку главни ограничувања на кои мора да се задржиме :
- void studentEnter() Сигнализира влез на еден студент. Ако студентот проба да влезе додека деканот се наоѓа во собата исфрла грешка - void dance() Сигнализира почеток на забавата - void deanEnter() Сигнализира влез на деканот. Тоа е возможно во два случаеви и тоа да нема студенти во собата или да има повеќе од 50 студенти во собата(има забава) - void studentLeave() Сигнализира заминување на студент од собата - void deanLeave() Сигнализира заминување на деканот. Кој не смее да ја напушти собата додека сите студенти не излезат - void breakUpParty() Деканот ја прекинува забавата. Може да ја расипе забавата ако има повеќе од 50 студенти. - void conductSearch() Деканот извршува пребарување на собата. Тоа е возможно ако нема присутни студенти.
Доколку имате грешка, ќе ја добиете пораката:
Procesot ne e sinhroniziran spored uslovite na zadacata.
После пораката ќе ви се прикаже логот на повикување на акциите и настанатите грешки.
Овој лог треба да ви послужи за увидување на тоа каде имате грешка во извршувањето на вашата задача.
Напомена:
Поради конкурентниот пристап за логирањето, можно е некои од пораките да не се на позицијата каде што треба да се. Токму затоа, овие пораки користете ги само како информација, но не се ослонувајте на нив.
Дедо Мраз одмара во својата фабрика на Северниот Пол.
Него може да го повикаат ирвасите кога ќе се вратат од Јужниот Пацифик за да им ја припреми санката, или елфовите кои имаат потешкотии при правењето на играчки (им недостигаат алатки за работа).
За ирвасите да го повикаат Дедо Мраз мора сите 9 да се вратени од нивниот одмор во тропските предели.
За елфовите да го повикаат да им донесе алатки мора 3 од нив да се присутни во работилницата (за да не мора постојано секој елф да го малтретира :-D ).
9 - тиот ирвас и 3 - тиот елф го повикуваат Дедо Мраз за да им пружи помош. Ако истовремено се присутни 3 елфови и 9 - те ирваси, тогаш Дедо Мраз ќе им даде приоритет на ирвасите.
Кога 3 елфови се наоѓаат во работилницата, секој нареден што ќе дојде мора да чека претходните 3 да завршат.
Има една инстанца од нишката Дедо Мраз (Santa), поголем број на инстанци од нишката Елф (Elf) и точно девет инстанци од нишката Ирвас (Reindeer).
Santa ќе се изврши онолку пати колку што е потребно за да ги задоволи и елфовите и ирвасите. Сите инстанци од Elf ќе се извршат по еднаш и 9 - те инстанци од Reindeer ќе се извршат по еднаш.
Треба да се повикаат методите во секоја од класите како што е наведено:
• state.reindeerArrived() - го повикува секој од ирвасите кога ќе пристигне на Северниот Пол. Го симболизира враќањето на ирвасот од одмор. • state.getHitched() - го повикува секој од ирвасите откако Дедо Мраз ќе ја припреми санката. Го симболизира поставувањето на ирвасот на своето место за да може да ја влече санката. Ако претходно не се сите ирваси пристигнати, овој метод ќе фрли исклучок. Ако Дедо Мраз не ја припремил претходно санката, овој метод ќе фрли исклучок. • state.prepSleigh() - го повикува Дедо Мраз. Го симболизира подготвувањето на санката. Ако Дедо Мраз бил повикан да ја припреми санката пред да пристигнат сите 9 ирваси, овој метод ќе фрли исклучок. Откако ќе ја припреми санката Дедо Мраз ги остава ирвасите да се сместат. • state.elfEntered() - го повикува секој од елфовите. Го симболизира влегувањето на елфот во работилницата. Ако некој елф влезе додека во работилницата има уште елфови кои работат или чекаат Дедо Мраз да им ги донесе алатките, овој метод ќе фрли исклучок. • state.getHelp() - го повикува секој од елфовите. Го симболизира земањето на алатките од Дедо Мраз и завршувањето со својата работа на правење играчки. Ако при првиот повик на овој метод немало 3 елфови кои чекаат помош, овој метод ќе фрли исклучок. Ако Дедо Мраз не ги има донесено алатките, овој метод ќе фрли исклучок. • state.helpElves() - го повикува Дедо Мраз. Го симболизира носењето на алатки на елфовите. Ако 9 - те ирваси чекаат кога овој метод ќе биде повикан, се фрла исклучок поради повисокиот приоритет на ирвасите. Ако не се присутни 3 елфови во работилницата (ако Дедо Мраз бил повикан да ги донесе алатките пред време), овој метод ќе фрли исклучок.
Се користат семафори и бројачи по желба. Тие треба да се иницијализираат во методот init(). Треба да се имплементираат методите execute() во секоја од трите класи користејќи ги претходно споменатите методи.
Starter File Solution File
Овој проблем е оригинално базиран на проблемот со автобусите на колеџот Wellesley. Патниците пристигнуваат на автобуска станица и чекаат автобус. Кога даден автобус ќе пристигне на автобуската станица сите патници кои моментално чекаат на станицата пробуваат да се качат во автобусот, но секој патник кој ќе пристигне по пристигнувањето на автобусот ќе мора да го чека следниот автобус. Капацитетот на секој од автобусите е 50 лица. Ако на автобуската станица чекаат повеќе од 50 патници, некои од нив ќе мора да го чекаат наредниот автобус за да се качат. Кога сите предвидени патници за тековниот автобус ќе се качат во истиот, тој си заминува од автобуската станица. Ако даден автобус пристигне во момент кога на автобуската станица не чека ниту еден патник, во тој случај автобусот треба веднаш да си замине.
state.busArrives()
state.riderArrives()
за дадениот патник и state.busArrives()
за соодветниот автобусПротребно е да се напише програмски код за синхронизација на горенаведените настани притоа обрнувајќи внимание на зададените ограничувања и користејќи ги понудените методи.
Starter File Solution File
Еден суши бар има место за 5 посетители. Доколку некој поестител дојде во барот кога има слободно место,
тој може веднаш да седне, но доколку дојде во момент кога сите 5 места се зафатени, тоа значи дека групата
e заедно дојдена и ќе мора да почека сите да станат за да може да седне (Внимание: Доколку еден посетител
ја напушти групата не значи дека групата е готова
т.е. доколку има посетители кои чекаат ќе мора да почекаат и другите членови да ја напуптат групата).
Вашата задача е да го синхронизирате претходното сценарио.
Во почетниот код кој е даден, дефинирана е класата Customer, која го симболизира однесувањето на посетителите на суши барот.
Има повеќе инстанци од класата Customer кај кои методот execute() се повикува повеќе пати.
Во имплементацијата, можете да ги користите следните методи од веќе дефинираната променлива state:
- state.seat() •Служи за проверка дали има место во барот и доколку има место седнува на масата. Доколку се повика додека барот е полн или пак додека групата сеуште е присутна ќе фрли исклучок. - state.groupGathered() •Го симболизира собирањето на групата. Се повикува од 5тиот член кога ќе седне на масата. Доколку се повика кога на масата нема 5 посетители ќе фрли исклучок. - state.eat() •Го симболизира времето додека посетителот седи во барот. - state.groupDone() •Го симболизира излагањето на групата од барот. Се повикува од последниот член на групата кога го напушта барот. Доколку се повика кога на масата сеуште има посетители ќе фрли исклучок. - state.done() •Го симболизира напуштањето на посетител од барот. Се повикува од секој посетител кој го напушта барот освен од последниот член на групата кој оваа функција ја извршува со методот state.groupDone(). Доколку се повика додека нема никој присутен во барот ќе фрли исклучок.
Претходно назначените методи служат за проверка на точноста на сценариото и не смеат да бидат променети и мораат да бидат повикани.
Вашата задача е да ги имплементирате методите Customer.execute() и init(). При имплементацијата, не смеете да додадете try-catch блок во нив.
Потребните семафори, глобални променливи и променливи за состојбите нa посетителите треба да ги дефинирате самите.
Доколку имате грешка, ќе ја добиете пораката:
Procesot ne e sinhroniziran spored uslovite na zadacata
По што ќе ви се прикаже логот на повикување на акциите и настанатите грешки.
Овој лог треба да ви послужи за увидување на тоа каде имате грешка во извршувањето на вашата задача.
Напомена: Поради конкурентниот пристап за логирањето, можно е некои од пораките да не се на позицијата каде што треба да се.
Токму затоа, овие пораки користете ги само како информација, но не се ослонувајте на нив.