Martina312

ос - Концерт

Apr 23rd, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.77 KB | None | 0 0
  1. //reshenie na:
  2. //https://github.com/finki-mk/OS/tree/master/synchronization/src/main/java/mk/ukim/finki/os/synchronization/exam17/k1/g2
  3.  
  4. package ispiti.concert;
  5.  
  6. import ispiti.ProblemExecution;
  7. import ispiti.TemplateThread;
  8.  
  9. import java.util.Date;
  10. import java.util.HashSet;
  11. import java.util.concurrent.Semaphore;
  12.  
  13. public class Concert {
  14.  
  15.     static Semaphore triGrupi;
  16.     static Semaphore baritoni;
  17.     static Semaphore tenori;
  18.     static Semaphore izveduvac;
  19.     static Semaphore ready;
  20.     static Semaphore signalBacking;
  21.     static Semaphore finished;
  22.     static Semaphore finishedForming;
  23.  
  24.     static Semaphore tenorHere;
  25.     static Semaphore baritonHere;
  26.  
  27.     static int numBaritons = 0;
  28.  
  29.  
  30.     public static void init() {
  31.         triGrupi = new Semaphore(0);
  32.         tenorHere = new Semaphore(0);
  33.         baritonHere = new Semaphore(0);
  34.         baritoni = new Semaphore(3);
  35.         tenori = new Semaphore(3);
  36.         ready = new Semaphore(0);
  37.         izveduvac = new Semaphore(1);
  38.         signalBacking = new Semaphore(0);
  39.         finished = new Semaphore(0);
  40.         finishedForming = new Semaphore(0);
  41.  
  42.     }
  43.  
  44.  
  45.     public static class Baritone extends TemplateThread {
  46.  
  47.         public Baritone(int numRuns) {
  48.             super(numRuns);
  49.         }
  50.  
  51.         @Override
  52.         public void execute() throws InterruptedException {
  53.             baritoni.acquire(); //maks 3 baritoni moze da dojda
  54.             numBaritons++; //fali samo lock za ova da se zashtiti
  55.             boolean controller = false;
  56.             if(numBaritons==3){ //posledniot bariton ke bide kontrolerot
  57.                 controller = true;
  58.             }
  59.             tenorHere.acquire(); //cekam da pristigne eden tenor za da formiram grupa
  60.             //tuka vekje teoretski e formirana edna grupa
  61.             ready.release(); //go izvestuvam tenorot deka grupata e formirana
  62.             state.formBackingVocals();
  63.             finishedForming.release(); //site izvestuvaat deka so formiranjeto zavrsile
  64.  
  65.             if(controller){
  66.                 finishedForming.acquire(6); //kontrolerot mora da se osigura deka site 6 backup vokali zavrsile
  67.                 triGrupi.release(3); //ako e taka, ke mu kaze na izveduvacot deka sega ima 3 grupi
  68.             }
  69.  
  70.             signalBacking.acquire(); //sekoj backup vokal treba da dobie od izveduvacot signal deka moze da pocne so izveduvanje
  71.             state.perform();
  72.             finished.release(); //koga zavrsuvaat mu kazuvaat na izveduvacot deka zavrsile
  73.  
  74.         }
  75.  
  76.     }
  77.  
  78.     public static class Tenor extends TemplateThread {
  79.  
  80.         public Tenor(int numRuns) {
  81.             super(numRuns);
  82.         }
  83.  
  84.         @Override
  85.         public void execute() throws InterruptedException {
  86.             tenori.acquire(); //maks 3 tenori
  87.             tenorHere.release();
  88.             ready.acquire(); //cekam odgovor deka moze da se formira grupata
  89.             state.formBackingVocals();
  90.             finishedForming.release(); //kazuva deka zavrsil so formiranje
  91.  
  92.             signalBacking.acquire();
  93.             state.perform();
  94.             finished.release();
  95.         }
  96.  
  97.     }
  98.  
  99.  
  100.     public static class Performer extends TemplateThread {
  101.  
  102.         public Performer(int numRuns) {
  103.             super(numRuns);
  104.         }
  105.  
  106.         @Override
  107.         public void execute() throws InterruptedException {
  108.             izveduvac.acquire();
  109.             triGrupi.acquire(3);
  110.  
  111.             signalBacking.release(6); //site 6 treba da gi izvestime deka moze da pocne so perform
  112.             state.perform();
  113.             finished.acquire(6); //baram odgovor deka zavrsile so performing
  114.             state.vote();
  115.  
  116.             //sega treba da se ostavi prostor za drug izveduvac so negovite 3 grupi
  117.             numBaritons = 0;
  118.             tenori.release(3);
  119.             baritoni.release(3);
  120.  
  121.             izveduvac.release();
  122.  
  123.         }
  124.  
  125.     }
  126.  
  127.     static ConcertState state = new ConcertState();
  128.  
  129.     public static void main(String[] args) {
  130.         for (int i = 0; i < 10; i++) {
  131.             run();
  132.         }
  133.     }
  134.  
  135.     public static void run() {
  136.         try {
  137.             int numRuns = 1;
  138.             int numScenarios = 300;
  139.  
  140.             HashSet<Thread> threads = new HashSet<Thread>();
  141.  
  142.             for (int i = 0; i < numScenarios; i++) {
  143.                 Tenor t = new Tenor(numRuns);
  144.                 Baritone b = new Baritone(numRuns);
  145.                 threads.add(t);
  146.                 if (i % 3 == 0) {
  147.                     Performer p = new Performer(numRuns);
  148.                     threads.add(p);
  149.                 }
  150.                 threads.add(b);
  151.             }
  152.  
  153.             init();
  154.  
  155.             ProblemExecution.start(threads, state);
  156.         } catch (Exception ex) {
  157.             ex.printStackTrace();
  158.         }
  159.     }
  160.  
  161. }
Add Comment
Please, Sign In to add comment