Advertisement
Latkoski

SushiBar synch

Jun 11th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.78 KB | None | 0 0
  1. Елитен суши бар има место за 6 посетители и функционира според следните правила:
  2.  
  3. посетителите може да влезат во барот само доколку има слободни места
  4. кога ќе се соберат 6 клиенти, го викаат келнерот за да ги послужи
  5. по послужувањето, клиентите започнуваат да јадат
  6. откако ќе завршат со јадење, секој од клиентите чека сите да завршат и излегуваат одеднаш
  7. нови клиенти не смеат да влезат додека не излезат оние што јаделе
  8. потоа сценариото може да започне одново
  9. Вашата задача е да го синхронизирате претходното сценарио.
  10.  
  11. Во почетниот код кој е даден, дефинирана е класа Customer, која го симболизира однесувањето на клиентите во суши барот. Има повеќе инстанци од класата Customer кај кои методот execute() се повикува еднаш.
  12.  
  13. Во имплементацијата, треба да ги користите следните методи од веќе дефинираната променлива state:
  14.  
  15. state.customerSeat()
  16. Го симболизира влегувањето на клиентот во барот.
  17. Се повикува од сите клиенти.
  18. Доколку се повика кога барот е полн, ќе фрли исклучок.
  19. Доколку се повика пред претходната група да заврши со јадење (state.eatingDone()), ќе фрли исклучок.
  20. state.callWaiter()
  21. Го симболизира повикувањето на келнерот и послужувањето на јадењето.
  22. Се повикува само од еден клиент.
  23. Доколку во моментот на повикот бројот на клиенти во барот не е точно 6, ќе фрли исклучок.
  24. state.customerEat()
  25. Го симболизира процесот на јадење на клиентите.
  26. Се повикува од сите клиенти.
  27. Доколку процесот на јадење не се извршува паралелно, ќе добиете порака за грешка.
  28. Доколку јадењето не е послужено (не завршил state.callWaiter() методот), ќе фрли исклучок.
  29. state.eatingDone()
  30. Означува дека сите клиенти завршиле со јадење и може да излезат.
  31. Се повикува само од еден клиент.
  32. Доколку во моменот на повикување има клиенти кои сеуште јадат, ќе фрли исклучок.
  33.  
  34.  
  35. package kol2015g1;
  36.  
  37. import problem.ProblemExecution;
  38. import problem.TemplateThread;
  39. import java.util.HashSet;
  40. import java.util.concurrent.Semaphore;
  41.  
  42. public class SushiBar {
  43.     public static Semaphore masa;
  44.     public static Semaphore lock;
  45.     public static int brojac;
  46.     public static Semaphore kontrola;
  47.     public static Semaphore mutex;
  48.  
  49.     public static void init() {
  50.         masa = new Semaphore(6);
  51.         lock = new Semaphore(1);
  52.         kontrola = new Semaphore(0);
  53.         mutex = new Semaphore(1);
  54.         brojac = 0;
  55.     }
  56.  
  57.     public static class Customer extends TemplateThread {
  58.  
  59.         public Customer(int numRuns) {
  60.             super(numRuns);
  61.         }
  62.  
  63.         @Override
  64.         public void execute() throws InterruptedException {
  65.             masa.acquire();// eden dosol.
  66.             state.customerSeat();
  67.  
  68.             lock.acquire();
  69.             brojac++;
  70.             if (brojac == 6) {// ako se 6 vikni kelner i pusti gi site
  71.                 state.callWaiter();
  72.                 kontrola.release(6);
  73.             }
  74.             lock.release();
  75.             kontrola.acquire();// jajt
  76.             state.customerEat();
  77.             lock.acquire();
  78.             brojac--;// odam do 0 za da zavrset so jadenje i sledni 6 da dojdet
  79.  
  80.             if (brojac == 0) {
  81.                 state.eatingDone();
  82.                 masa.release(6);
  83.                
  84.             }
  85.             lock.release();
  86.         }
  87.  
  88.     }
  89.  
  90.     public static void main(String[] args) {
  91.         for (int i = 0; i < 10; i++) {
  92.             run();
  93.         }
  94.     }
  95.  
  96.     static SushiBarState state = new SushiBarState();
  97.  
  98.     public static void run() {
  99.         try {
  100.             int numRuns = 1;
  101.             int numIterations = 1200;
  102.  
  103.             HashSet<Thread> threads = new HashSet<Thread>();
  104.  
  105.             for (int i = 0; i < numIterations; i++) {
  106.                 Customer c = new Customer(numRuns);
  107.                 threads.add(c);
  108.             }
  109.  
  110.             init();
  111.  
  112.             ProblemExecution.start(threads, state);
  113.             // System.out.println(new Date().getTime());
  114.         } catch (Exception ex) {
  115.             ex.printStackTrace();
  116.         }
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement