Martina312

ОС - Volleyball

Apr 23rd, 2020
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.17 KB | None | 0 0
  1. //https://github.com/finki-mk/OS/tree/master/synchronization/src/main/java/mk/ukim/finki/os/synchronization/exam19/s2
  2.  
  3. package ispiti.volleyballTournament;
  4.  
  5. import java.time.LocalDateTime;
  6. import java.util.HashSet;
  7. import java.util.concurrent.Semaphore;
  8. import java.util.concurrent.locks.Lock;
  9.  
  10. public class VolleyballTournament {
  11.  
  12.     public static void main(String[] args) throws InterruptedException {
  13.         HashSet<Player> threads = new HashSet<>();
  14.         for (int i = 0; i < 60; i++) {
  15.             Player p = new Player();
  16.             threads.add(p);
  17.         }
  18.         init();
  19.         for(Thread t:threads){
  20.             t.start();
  21.         }
  22.  
  23.         for(Thread t:threads){
  24.             t.join();
  25.         }
  26.         System.out.println("Tournament finished.");
  27.     }
  28.  
  29.     public static void init(){
  30.         Locks.canEnter = new Semaphore(12);
  31.         Locks.enterGarderober = new Semaphore(4);
  32.         Locks.doneChanging = new Semaphore(0);
  33.         Locks.startGame = new Semaphore(0);
  34.         Locks.gameFinished = new Semaphore(0);
  35.     }
  36. }
  37.  
  38. class Locks{
  39.     static Semaphore canEnter;
  40.     static Semaphore enterGarderober;
  41.     static int players = 0;
  42.     static Semaphore doneChanging;
  43.     static Semaphore startGame;
  44.     static Semaphore gameFinished;
  45.     static int playersChanging = 0;
  46. }
  47. class Player extends Thread{
  48.  
  49.     public void execute() throws InterruptedException {
  50.        Locks.canEnter.acquire(); //maksimum 12 igraci smeat da bidat prisutni
  51.        System.out.println("Player inside.");
  52.  
  53.        Locks.enterGarderober.acquire(); //samo 4ca smeat da se vo garderoberot
  54.        synchronized (Player.class){
  55.             Locks.playersChanging++; //zgolemuvame kolku se vo garderoberot
  56.        }
  57.        System.out.println("In dressing room.");
  58.        Thread.sleep(10);// se presoblekuvaat
  59.        if(Locks.playersChanging == 4){
  60.            //ako e ova posledniot
  61.            Locks.playersChanging = 0;
  62.            Locks.enterGarderober.release(4); //ozdava dozvola da vlezat ushte 4
  63.        }
  64.        Locks.doneChanging.release(); //zavrsile so presoblekuvanje
  65.  
  66.         synchronized (Player.class){
  67.             Locks.players++;
  68.         }
  69.  
  70.         boolean controller = false;
  71.         if(Locks.players == 12){ //posledniot ke bide kontrolerot
  72.             controller = true;
  73.             Locks.enterGarderober.acquire(4);
  74.             Locks.doneChanging.acquire(12); //gi ceka site
  75.             Locks.startGame.release(12); //dava dozvola da pocnat
  76.         }
  77.  
  78.         Locks.startGame.acquire();
  79.         System.out.println("Game started.");
  80.         Thread.sleep(100);// this represent the game duration
  81.         System.out.println("Player done.");
  82.         Locks.gameFinished.release();
  83.         if(controller) {
  84.             Locks.gameFinished.acquire(12);
  85.             System.out.println("Game finished.");
  86.             Locks.players = 0;
  87.             Locks.playersChanging = 0;
  88.             Locks.canEnter.release(12);
  89.             Locks.enterGarderober.release(4);
  90.         }
  91.     }
  92.  
  93.     @Override
  94.     public void run() {
  95.         try {
  96.             execute();
  97.         } catch (InterruptedException e) {
  98.             e.printStackTrace();
  99.         }
  100.     }
  101. }
Add Comment
Please, Sign In to add comment