Martina312

ОС - Macau Card Tournament

Apr 23rd, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.22 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/exam19/k1/g1
  3.  
  4.  
  5. import java.lang.reflect.GenericArrayType;
  6. import java.util.HashSet;
  7. import java.util.concurrent.Semaphore;
  8. import java.util.concurrent.locks.Lock;
  9.  
  10. class Locks{
  11.     static Semaphore greenPlayers;
  12.     static Semaphore redPlayers;
  13.     static int numPlayers = 0;
  14.     static Semaphore canPlay;
  15.     static Semaphore gameFinished;
  16. }
  17.  
  18. class GreenPlayer extends Thread {
  19.  
  20.     public void execute() throws InterruptedException {
  21.         System.out.println("Green player ready");
  22.         Thread.sleep(50);
  23.  
  24.         Locks.greenPlayers.acquire(); //maksimum dvajca ke dojdat
  25.         System.out.println("Green player here");
  26.         boolean controller = false;
  27.         Locks.numPlayers++;
  28.  
  29.         if(Locks.numPlayers==4){ //posledniot igrac ke bide kontrolerot
  30.             Locks.canPlay.release(4);
  31.             controller = true;
  32.         }
  33.  
  34.  
  35.         for(int i=1;i<=3;i++) {
  36.             Locks.canPlay.acquire();
  37.             System.out.println("Game " + i + " started");
  38.             Thread.sleep(200);
  39.             System.out.println("Green player finished game " + i);
  40.             Locks.gameFinished.release();
  41.  
  42.             if (controller) {
  43.                 Locks.gameFinished.acquire(4);
  44.                 System.out.println("Game " + i + " finished");
  45.                 if(i!=3) {
  46.                     Locks.canPlay.release(4);
  47.                 }
  48.             }
  49.         }
  50.  
  51.         if(controller){
  52.             System.out.println("Match finished");
  53.             Locks.numPlayers = 0;
  54.             Locks.redPlayers.release(2);
  55.             Locks.greenPlayers.release(2);
  56.         }
  57.  
  58.     }
  59.  
  60.     @Override
  61.     public void run() {
  62.         try {
  63.             execute();
  64.         } catch (InterruptedException e) {
  65.             e.printStackTrace();
  66.         }
  67.     }
  68. }
  69.  
  70. class RedPlayer extends Thread{
  71.  
  72.     public void execute() throws InterruptedException {
  73.         System.out.println("Red player ready");
  74.         Thread.sleep(50);
  75.  
  76.         Locks.redPlayers.acquire(); //maksimum 2ca ke dojdat
  77.         System.out.println("Red player here");
  78.         boolean controller = false;
  79.         Locks.numPlayers++;
  80.  
  81.         if(Locks.numPlayers==4){
  82.             Locks.canPlay.release(4);
  83.             controller = true;
  84.         }
  85.  
  86.         for(int i=1;i<=3;i++) {
  87.             Locks.canPlay.acquire();
  88.             System.out.println("Game " + i + " started");
  89.             Thread.sleep(200);
  90.             System.out.println("Red player finished game " + i);
  91.             Locks.gameFinished.release();
  92.             if (controller) {
  93.                 Locks.gameFinished.acquire(4);
  94.                 System.out.println("Game " + i + " finished");
  95.                 if(i!=3) {
  96.                     Locks.canPlay.release(4);
  97.                 }
  98.             }
  99.         }
  100.  
  101.         if(controller){
  102.             System.out.println("Match finished");
  103.             Locks.numPlayers = 0;
  104.             Locks.redPlayers.release(2);
  105.             Locks.greenPlayers.release(2);
  106.         }
  107.  
  108.     }
  109.  
  110.     @Override
  111.     public void run() {
  112.         try {
  113.             execute();
  114.         } catch (InterruptedException e) {
  115.             e.printStackTrace();
  116.         }
  117.     }
  118. }
  119.  
  120. public class MacauCardTournament {
  121.  
  122.     public static void init(){
  123.         Locks.greenPlayers = new Semaphore(2);
  124.         Locks.redPlayers = new Semaphore(2);
  125.         Locks.canPlay = new Semaphore(0);
  126.         Locks.gameFinished = new Semaphore(0);
  127.     }
  128.     public static void main(String[] args) throws InterruptedException {
  129.         HashSet<Thread> threads = new HashSet<Thread>();
  130.         for (int i = 0; i < 30; i++) {
  131.             RedPlayer red = new RedPlayer();
  132.             threads.add(red);
  133.             GreenPlayer green = new GreenPlayer();
  134.             threads.add(green);
  135.         }
  136.  
  137.         init();
  138.         // start 30 red and 30 green players in background
  139.        for(Thread t:threads){
  140.            t.start();
  141.        }
  142.  
  143.        for(Thread t:threads){
  144.            t.join();
  145.        }
  146.         // after the waiting for each of the players is done, check the one that are not finished and terminate them
  147.         System.err.println("Uspeh");
  148.     }
  149.  
  150. }
Add Comment
Please, Sign In to add comment