Advertisement
Latkoski

TribeDinnerSeptember synch

Jun 15th, 2016
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.23 KB | None | 0 0
  1. Едно племе јаде заеднична вечера од голем казан во кој има ограничен број порции. Доколку има храна во казанот, секој член од племето сам се послужува и седнува на трпезата да јаде. Доколку казанот е празен, се повикува готвачот за да зготви нов казан со храна и сите кои не започнале да јадат чекаат додека готвачот не ги извести дека вечерата е готова. Притоа, трпезата има место за максимум четворица, што значи дека максимум четворица истовремено може да јадат. Доколку нема место на трпезата, членовите чекаат додека не се ослободи.
  2.  
  3. Вашата задача е да го синхронизирате претходното сценарио.
  4.  
  5. Во почетниот код кој е даден, дефинирани се класите TribeMember и Chef, кои го симболизираат однесувањето на членовите на племето и готвачот, соодветно. Во имплементацијата, треба да ги користите следните методи од веќе дефинираната променлива state:
  6.  
  7. state.isPotEmpty()
  8. Враќа boolean кој означува дали казанот е празен.
  9. Се повикува од сите членови на племето.
  10. Доколку повеќе членови паралелно проверуваат, ќе добиете порака за грешка.
  11. state.fillPlate()
  12. Го симболизира земањето храна од казанот.
  13. Се повикува од сите членови на племето.
  14. Доколку казанот е празен, ќе добиете порака за грешка.
  15. Доколку повеќе членови паралелно земаат храна, ќе добиете порака за грешка.
  16. state.eat()
  17. Го симболизира јадењето на трпезата на членовите на племето.
  18. Се повикува од сите членови на племето.
  19. Доколку повеќе од четворица паралелно јадат, ќе добиете порака за грешка.
  20. Доколку методот се извршува секвенцијално (само од еден член во еден момент), ќе добиете порака за грешка.
  21. state.cook()
  22. Го симболизира готвењето на храна во казанот од страна на готвачот.
  23. Се повикува само од готвачот.
  24. Доколку методот се повика, а казанот не е празен, ќе добиете порака за грешка.
  25.  
  26.  
  27.  
  28. package kol2015g1;
  29.  
  30. import java.util.Date;
  31. import java.util.HashSet;
  32. import java.util.concurrent.Semaphore;
  33.  
  34. import problem.ProblemExecution;
  35. import problem.TemplateThread;
  36.  
  37. public class SeptemberTribeDinnerSynchronization {
  38.  
  39.     public static Semaphore lock;
  40.     public static Semaphore blockChef;
  41.     public static Semaphore blockMember;
  42.     public static int broj;
  43.     public static Semaphore trpeza;
  44.  
  45.     public static void init() {
  46.         lock = new Semaphore(1);
  47.         trpeza = new Semaphore(4);
  48.         blockChef = new Semaphore(0);
  49.         blockMember = new Semaphore(0);
  50.         broj = 0;
  51.     }
  52.  
  53.     public static class TribeMember extends TemplateThread {
  54.  
  55.         public TribeMember(int numRuns) {
  56.             super(numRuns);
  57.         }
  58.  
  59.         @Override
  60.         public void execute() throws InterruptedException {
  61.             lock.acquire(); // zaradi so mojt samo eden da provervit zato koristam mutex
  62.             if (state.isPotEmpty()) { //ako e prazen se oslobodvit za da gotvit
  63.                 blockChef.release();
  64.                 blockMember.acquire(); // cekat toj od plemeto za da jajt, dolu go oslobdvime
  65.             }
  66.             state.fillPlate();
  67.             lock.release();
  68.            
  69.             trpeza.acquire();
  70.             state.eat();
  71.             trpeza.release();
  72.  
  73.         }
  74.     }
  75.  
  76.     public static class Chef extends TemplateThread {
  77.  
  78.         public Chef(int numRuns) {
  79.             super(numRuns);
  80.         }
  81.  
  82.         @Override
  83.         public void execute() throws InterruptedException {
  84.             blockChef.acquire(); // ovde gotvit ako se oslobodit gotvacot => ako e prazen kazanot
  85.             state.cook();
  86.             blockMember.release(); // se oslobdvit toj od plemeto za da jajt i sednit na trpeza
  87.  
  88.         }
  89.     }
  90.  
  91.     static SeptemberTribeDinnerState state = new SeptemberTribeDinnerState();
  92.  
  93.     public static void main(String[] args) {
  94.         for (int i = 0; i < 10; i++) {
  95.             run();
  96.         }
  97.     }
  98.  
  99.     public static void run() {
  100.         try {
  101.             int numRuns = 1;
  102.             int numIterations = 150;
  103.  
  104.             HashSet<Thread> threads = new HashSet<Thread>();
  105.  
  106.             for (int i = 0; i < numIterations; i++) {
  107.                 TribeMember h = new TribeMember(numRuns);
  108.                 threads.add(h);
  109.             }
  110.  
  111.             Chef chef = new Chef(10);
  112.             threads.add(chef);
  113.  
  114.             init();
  115.  
  116.             ProblemExecution.start(threads, state);
  117.             System.out.println(new Date().getTime());
  118.         } catch (Exception ex) {
  119.             ex.printStackTrace();
  120.         }
  121.     }
  122.  
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement