Advertisement
Latkoski

Carnival synch

Jun 15th, 2016
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.15 KB | None | 0 0
  1. На еден карневал на кој има 30 учесници има само една бина на која има место за 10 учесници. Презентацијата на учесниците на бината се одвива во повеќе циклуси, каде во секој циклус на бината својата точка ја изведуваат 3 групи на учесници, една по една. Групите се составуваат произволно,според тоа дали има место на бината и како пристигнале учесниците. Карневалот се одвива според следните правила:
  2.  
  3. учесниците може да излезат на бината само доколку има слободни места
  4. кога ќе се соберат 10 учесници на бината, започнуваат со својата точка
  5. откако ќе завршат со точката, секој од учесниците чека да завршат останатите групи, пред да се обиде повторно да се качи на бината
  6. нови играчи не смеат да влезат додека не излезат оние што претходно играле
  7. потоа сценариото може да започне од почеток
  8. Вашата задача е да го синхронизирате претходното сценарио.
  9.  
  10. Во почетниот код кој е даден, дефинирана е класа Participant, која го симболизира однесувањето на учесниците на карневалот. Има 30 инстанци од класата Participant кај кои методот execute() се повикува онолку пати колку што има циклуси на карневалот.
  11.  
  12. Во имплементацијата, треба да ги користите следните методи од веќе дефинираната променлива state:
  13.  
  14. state.participantEnter()
  15. Го симболизира влегувањето на учесникот на бината.
  16. Се повикува од сите учесници.
  17. Доколку ист учесник го повика методот во рамките на ист циклус, ќе повика исклучок.
  18. Доколку се повика кога бината е полна, ќе фрли исклучок.
  19. Доколку се повика пред претходната група да заврши со презентирањето(state.endGroup()), ќе фрли исклучок.
  20. state.present()
  21. Го симболизира процесот на презентирање на учесниците.
  22. Се повикува од сите учесници.
  23. Доколку процесот на презентирање не се извршува паралелно, ќе добиете порака за грешка.
  24. Доколку бината не е пополнета (нема точно 10 присутни учесници), ќе фрли исклучок.
  25. state.endGroup()
  26. Означува дека сите учесници од групата завршиле со презентирањето и може да излезат од бината.
  27. Се повикува само од еден учесник.
  28. Доколку во моменот на повикување има учесници кои се' уште се присутни на бината, ќе фрли исклучок.
  29. state.endCycle()
  30. Означува дека сите групи и учесници завршиле со презентирањето и може да започне следниот циклус.
  31. Се повикува само од еден учесник.
  32. Доколку во моменот на повикување има учесници кои се' уште не завршиле, ќе фрли исклучок.
  33.  
  34.  
  35.  
  36.  
  37. package kol2015g1;
  38.  
  39. import problem.ProblemExecution;
  40. import problem.TemplateThread;
  41. import java.util.HashSet;
  42. import java.util.concurrent.Semaphore;
  43.  
  44. public class CarnivalSolution {
  45.  
  46.     public static Semaphore stage;
  47.     public static Semaphore lock;
  48.     public static Semaphore blockParticipant;
  49.     public static Semaphore blokGrupa;
  50.     public static int brojac;
  51.     public static int vkupenBrojac;
  52.  
  53.     public static void init() {
  54.         stage = new Semaphore(10);
  55.         lock = new Semaphore(1);
  56.         blockParticipant = new Semaphore(0);
  57.         brojac = 0;
  58.         vkupenBrojac = 0;
  59.         blokGrupa = new Semaphore(0);
  60.     }
  61.  
  62.     public static class Participant extends TemplateThread {
  63.  
  64.         public Participant(int numRuns) {
  65.             super(numRuns);
  66.         }
  67.  
  68.         @Override
  69.         public void execute() throws InterruptedException {
  70.             stage.acquire(); //eden idat i se kacvit na scena
  71.            
  72.             lock.acquire();
  73.             state.participantEnter();
  74.             brojac++;
  75.             if (brojac == 10) {
  76.                 blockParticipant.release(10); // 10 dusi se pustet za da prodolzet posle acquire
  77.             }
  78.             lock.release();
  79.            
  80.            
  81.             blockParticipant.acquire();  
  82.             state.present(); //pocvet so prezentriranje
  83.            
  84.            
  85.             lock.acquire();
  86.             brojac--; //go namalvime brojacot za da zavrsit grupata
  87.             vkupenBrojac++; //vkupno lugje za da zavrsit celoto prezentiranje
  88.             if (brojac == 0) {
  89.                 stage.release(10);
  90.                 state.endGroup();
  91.             }
  92.            
  93.             if (vkupenBrojac == 30){
  94.                 blokGrupa.release(30); //zavrsil cel karneval
  95.                 state.endCycle();
  96.                 vkupenBrojac = 0;
  97.             }
  98.             lock.release();
  99.            
  100.             blokGrupa.acquire(); //se blokiret site za da pominet site grupi
  101.            
  102.         }
  103.  
  104.     }
  105.  
  106.     public static void main(String[] args) {
  107.         for (int i = 0; i < 10; i++) {
  108.             run();
  109.         }
  110.     }
  111.  
  112.     static CarnivalState state = new CarnivalState();
  113.  
  114.     public static void run() {
  115.         try {
  116.             int numRuns = 15;
  117.             int numThreads = 30;
  118.  
  119.             HashSet<Thread> threads = new HashSet<Thread>();
  120.  
  121.             for (int i = 0; i < numThreads; i++) {
  122.                 Participant c = new Participant(numRuns);
  123.                 threads.add(c);
  124.             }
  125.  
  126.             init();
  127.  
  128.             ProblemExecution.start(threads, state);
  129.         } catch (Exception ex) {
  130.             ex.printStackTrace();
  131.         }
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement