Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.56 KB | None | 0 0
  1. package os.examples.modern.gui.solutions;
  2.  
  3. import java.util.concurrent.Semaphore;
  4.  
  5. import os.simulation.Application;
  6. import os.simulation.AutoCreate;
  7. import os.simulation.Container;
  8. import os.simulation.Item;
  9. import os.simulation.Operation;
  10. import os.simulation.Thread;
  11.  
  12. /*
  13.  * U okviru maturske ekskurzije, za djake iz tri evropske drzave - Engleske,
  14.  * Nemacke i Italije - je organizovan obilazak muzeja Louvre u Parizu. Sve tri
  15.  * grupe djaka borave neko vreme ispred muzeja, nakon cega ulaze u muzej i uzi-
  16.  * vaju u izlozenim umetnickim delima. Medjutim, u jednom momentu samo djaci
  17.  * jedne drzave mogu boraviti u muzeju, jer bi se u suprotnom njihovi vodici
  18.  * morali nadvikivati i niko nista ne bi cuo.
  19.  *
  20.  * Sinhronizovati boravak djaka u muzeju koriscenjem semafora, tako da u jednom
  21.  * momentu samo jedna grupa bude unutar muzeja. Svaki djak je predstavljen jed-
  22.  * nom niti cija klasa odredjuje drzavu iz koje on dolazi.
  23.  */
  24. public class MuzejResenje extends Application {
  25.  
  26.     protected final Semaphore muteksZaMuzej = new Semaphore(1);
  27.  
  28.     protected final Vodic vodicEngleza = new Vodic(muteksZaMuzej);
  29.     protected final Vodic vodicNemaca = new Vodic(muteksZaMuzej);
  30.     protected final Vodic vodicItalijana = new Vodic(muteksZaMuzej);
  31.  
  32.     protected class Vodic {
  33.  
  34.         private final Semaphore muteksZaMuzej;
  35.         private final Semaphore muteksZaBrojac = new Semaphore(1);
  36.         private int br;
  37.  
  38.         public Vodic(Semaphore muteksZaMuzej) {
  39.             this.muteksZaMuzej = muteksZaMuzej;
  40.         }
  41.  
  42.         public void zauzmiMuzej() {
  43.             muteksZaBrojac.acquireUninterruptibly();
  44.             try {
  45.                 br++;
  46.                 if (br == 1) {
  47.                     muteksZaMuzej.acquireUninterruptibly();
  48.                 }
  49.             } finally {
  50.                 muteksZaBrojac.release();
  51.             }
  52.         }
  53.  
  54.         public void oslobodiMuzej() {
  55.             muteksZaBrojac.acquireUninterruptibly();
  56.             try {
  57.                 br--;
  58.                 if (br == 0) {
  59.                     muteksZaMuzej.release();
  60.                 }
  61.             } finally {
  62.                 muteksZaBrojac.release();
  63.             }
  64.         }
  65.     }
  66.  
  67.     @AutoCreate(8)
  68.     protected class Englez extends Thread {
  69.  
  70.         @Override
  71.         protected void step() {
  72.             odmara();
  73.             vodicEngleza.zauzmiMuzej();
  74.             try {
  75.                 obilazi();
  76.             } finally {
  77.                 vodicEngleza.oslobodiMuzej();
  78.             }
  79.         }
  80.     }
  81.  
  82.     @AutoCreate(8)
  83.     protected class Nemac extends Thread {
  84.  
  85.         @Override
  86.         protected void step() {
  87.             odmara();
  88.             vodicNemaca.zauzmiMuzej();
  89.             try {
  90.                 obilazi();
  91.             } finally {
  92.                 vodicNemaca.oslobodiMuzej();
  93.             }
  94.         }
  95.     }
  96.  
  97.     @AutoCreate(8)
  98.     protected class Italijan extends Thread {
  99.  
  100.         @Override
  101.         protected void step() {
  102.             odmara();
  103.             vodicItalijana.zauzmiMuzej();
  104.             try {
  105.                 obilazi();
  106.             } finally {
  107.                 vodicItalijana.oslobodiMuzej();
  108.             }
  109.         }
  110.     }
  111.  
  112.     // ------------------- //
  113.     //    Sistemski deo    //
  114.     // ------------------- //
  115.     // Ne dirati kod ispod //
  116.     // ------------------- //
  117.  
  118.     protected final Container englezi   = box("Енглези").color(MAROON);
  119.     protected final Container nemci     = box("Немци").color(ROYAL);
  120.     protected final Container italijani = box("Италијани").color(ARMY);
  121.     protected final Container muzej     = box("Музеј").color(NAVY);
  122.     protected final Container main      = column(row(englezi, nemci, italijani), muzej);
  123.     protected final Operation englez    = init().container(englezi).name("Енглез %d").color(RED);
  124.     protected final Operation nemac     = init().container(nemci).name("Немац %d").color(PURPLE);
  125.     protected final Operation italijan  = init().container(italijani).name("Италијан %d").color(GREEN);
  126.  
  127.     protected final Operation odmaranje = duration("7±2").text("Одмара").textAfter("Чека");
  128.     protected final Operation obilazak  = duration("5±2").text("Обилази").container(muzej).textAfter("Обишао").update(this::azuriraj);
  129.  
  130.     protected void odmara() {
  131.         odmaranje.performUninterruptibly();
  132.     }
  133.  
  134.     protected void obilazi() {
  135.         obilazak.performUninterruptibly();
  136.     }
  137.  
  138.     protected void azuriraj(Item item) {
  139.         long brE = muzej.stream(Englez.class).count();
  140.         long brN = muzej.stream(Nemac.class).count();
  141.         long brI = muzej.stream(Italijan.class).count();
  142.         muzej.setText(String.format("%d / %d / %d", brE, brN, brI));
  143.         if (brE == 0 && brN == 0 && brI == 0) {
  144.             muzej.setColor(NAVY);
  145.         } else if (brE > 0 && brN == 0 && brI == 0) {
  146.             muzej.setColor(MAROON);
  147.         } else if (brE == 0 && brN > 0 && brI == 0) {
  148.             muzej.setColor(ROYAL);
  149.         } else if (brE == 0 && brN == 0 && brI > 0) {
  150.             muzej.setColor(ARMY);
  151.         } else {
  152.             muzej.setColor(CARBON);
  153.         }
  154.     }
  155.  
  156.     @Override
  157.     protected void initialize() {
  158.         azuriraj(null);
  159.     }
  160.  
  161.     public static void main(String[] a) {
  162.         launch("Музеј");
  163.     }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement