Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Елитен суши бар има место за 6 посетители и функционира според следните правила:
- посетителите може да влезат во барот само доколку има слободни места
- кога ќе се соберат 6 клиенти, го викаат келнерот за да ги послужи
- по послужувањето, клиентите започнуваат да јадат
- откако ќе завршат со јадење, секој од клиентите чека сите да завршат и излегуваат одеднаш
- нови клиенти не смеат да влезат додека не излезат оние што јаделе
- потоа сценариото може да започне одново
- Вашата задача е да го синхронизирате претходното сценарио.
- Во почетниот код кој е даден, дефинирана е класа Customer, која го симболизира однесувањето на клиентите во суши барот. Има повеќе инстанци од класата Customer кај кои методот execute() се повикува еднаш.
- Во имплементацијата, треба да ги користите следните методи од веќе дефинираната променлива state:
- state.customerSeat()
- Го симболизира влегувањето на клиентот во барот.
- Се повикува од сите клиенти.
- Доколку се повика кога барот е полн, ќе фрли исклучок.
- Доколку се повика пред претходната група да заврши со јадење (state.eatingDone()), ќе фрли исклучок.
- state.callWaiter()
- Го симболизира повикувањето на келнерот и послужувањето на јадењето.
- Се повикува само од еден клиент.
- Доколку во моментот на повикот бројот на клиенти во барот не е точно 6, ќе фрли исклучок.
- state.customerEat()
- Го симболизира процесот на јадење на клиентите.
- Се повикува од сите клиенти.
- Доколку процесот на јадење не се извршува паралелно, ќе добиете порака за грешка.
- Доколку јадењето не е послужено (не завршил state.callWaiter() методот), ќе фрли исклучок.
- state.eatingDone()
- Означува дека сите клиенти завршиле со јадење и може да излезат.
- Се повикува само од еден клиент.
- Доколку во моменот на повикување има клиенти кои сеуште јадат, ќе фрли исклучок.
- package kol2015g1;
- import problem.ProblemExecution;
- import problem.TemplateThread;
- import java.util.HashSet;
- import java.util.concurrent.Semaphore;
- public class SushiBar {
- public static Semaphore masa;
- public static Semaphore lock;
- public static int brojac;
- public static Semaphore kontrola;
- public static Semaphore mutex;
- public static void init() {
- masa = new Semaphore(6);
- lock = new Semaphore(1);
- kontrola = new Semaphore(0);
- mutex = new Semaphore(1);
- brojac = 0;
- }
- public static class Customer extends TemplateThread {
- public Customer(int numRuns) {
- super(numRuns);
- }
- @Override
- public void execute() throws InterruptedException {
- masa.acquire();// eden dosol.
- state.customerSeat();
- lock.acquire();
- brojac++;
- if (brojac == 6) {// ako se 6 vikni kelner i pusti gi site
- state.callWaiter();
- kontrola.release(6);
- }
- lock.release();
- kontrola.acquire();// jajt
- state.customerEat();
- lock.acquire();
- brojac--;// odam do 0 za da zavrset so jadenje i sledni 6 da dojdet
- if (brojac == 0) {
- state.eatingDone();
- masa.release(6);
- }
- lock.release();
- }
- }
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- run();
- }
- }
- static SushiBarState state = new SushiBarState();
- public static void run() {
- try {
- int numRuns = 1;
- int numIterations = 1200;
- HashSet<Thread> threads = new HashSet<Thread>();
- for (int i = 0; i < numIterations; i++) {
- Customer c = new Customer(numRuns);
- threads.add(c);
- }
- init();
- ProblemExecution.start(threads, state);
- // System.out.println(new Date().getTime());
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement