Dzok1517

MuzejAtomici

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