Advertisement
JovanPapi

[OS - Ispitna] - AlOH3

Apr 6th, 2019
441
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.91 KB | None | 0 0
  1. Al(OH)<sub>3</sub>
  2. ======
  3.  
  4. Во една фабрика потребно е производство на алуминиум хидроксид - Al(OH)<sub>3</sub>
  5.  
  6. Во процесот на производство, прво паралелно се формираат трите OH групи
  7. (секоја составена од по еден атом на кислород (O) и водород (H), за потоа да се поврзат со атомот на алуминиум (Al).
  8. Имате бесконечна количина од кислород, водород и алуминиум. Молекулите на Al(OH)<sub>3</sub> се формираат една по една.
  9.  
  10. Потребно е да го синхронизирате креирањето на алуминиум хидроксид (Al(OH)<sub>3</sub>) со користење на следните функции:
  11.  
  12.  - `state.bondOH()` - Кажува дека може да се формира OH група
  13.     - Се повиква само кај кислородните и водородните атоми.
  14.     - Треба да се повика истовремено од сите кислородни и водородни атоми кои учествуваат во процесот на формирање на една молекула Al(OH)<sub>3</sub>, за да се формираат нејзините OH групи.
  15.     - Треба трите OH групи од молекулата да се креираат паралелно (во спротивен случај ќе добиете порака за грешка).
  16.     - При повикот, водородните атоми треба да се сигурни дека има присутен кислороден атом и обратно.
  17.     - Доколку методот истовремено го повикаат повеќе од три пара кислородни и водородни атоми, ќе добиете порака за грешка.
  18.  - `state.bondAlOH()` - Кажува дека може да се формира Al(OH)<sub>3</sub> молекулата
  19.     - Треба да се повика од сите атоми кои учествуваат во процесот на креирање на молекулата.
  20.     - Доколку претходно не се формирани трите OH групи, ќе добиете порака за грешка.
  21.     - Доколку методот е повикан од повеќе од 3 кислородни, 3 водородни и 1 алуминиумов атом, ќе добиете порака за грешка.
  22.  - `state.validate()` - Проверува дали молекулата е формирана успешно
  23.     - Се повикува **само од еден** атом по креирањето на молекулата
  24.        - вие одлучете од кој атом (отстранете го овој повик од `execute()` методот на другите две класи).
  25.     - Доколку не се присутни три OH групи и атом на алуминиум во процесот на спојување на молекулата (`state.bondAlOH()`), ќе добиете порака за грешка.
  26.    
  27. За решавање на задачата, преземете го проектот со клик на копчето `Starter file`, отпакувајте го и отворете го со Eclipse или Netbeans.  
  28.  
  29. Вашата задача е да ги имплементирате методите `execute()` од класите `Oxygen`, `Hydrogen` и `Aluminium`, кои се наоѓаат во фајлот `AluminiumHydroxide.java`. При решавањето можете да користите семафори и монитори по ваша желба и нивната иницијализација треба да ја направите во `init()` методот.
  30.  
  31. При стартувањето на класата, сценариото ќе се повика 10 пати, со креирање на голем број инстанци од класите `Oxygen`, `Hydrogen` и `Aluminium` и паралелно само еднаш ќе се повика нивниот `execute()` метод.
  32.  
  33. Решението треба да се прикачи според инструкциите подолу.
  34.  
  35.  
  36.  
  37.  
  38. import java.util.Date;
  39. import java.util.HashSet;
  40. import java.util.concurrent.Semaphore;
  41.  
  42.  
  43. public class AluminiumHydroxide {
  44.    
  45.     static Semaphore oNapraveno;
  46.     static Semaphore hNapraveno;
  47.     static Semaphore oMax;
  48.     static Semaphore hMax;
  49.     static Semaphore ohNapraveno;
  50.     static Semaphore alNapraveno;
  51.     static Semaphore alMax;
  52.     static Semaphore seEVoRed;
  53.     static Semaphore oVlezi;
  54.     static Semaphore hVlezi;
  55.    
  56.  
  57.     public static void init() {
  58.         oMax = new Semaphore(3);
  59.         oNapraveno = new Semaphore(0);
  60.         hNapraveno = new Semaphore(0);
  61.         hMax = new Semaphore(3);
  62.         ohNapraveno = new Semaphore(0);
  63.         alNapraveno = new Semaphore(0);
  64.         alMax = new Semaphore(1);
  65.         seEVoRed = new Semaphore(0);
  66.         oVlezi = new Semaphore(0);
  67.         hVlezi = new Semaphore(0);
  68.  
  69.     }
  70.  
  71.     public static class Hydrogen extends TemplateThread {
  72.  
  73.         public Hydrogen(int numRuns) {
  74.             super(numRuns);
  75.         }
  76.  
  77.         @Override
  78.         public void execute() throws InterruptedException {
  79.            
  80.             hMax.acquire();
  81.             hNapraveno.release();
  82.            
  83.             oNapraveno.acquire();
  84.            
  85.             state.bondOH();
  86.            
  87.             ohNapraveno.release();
  88.  
  89.            
  90.            
  91.             alNapraveno.acquire();
  92.            
  93.            
  94.             state.bondAlOH3();
  95.             hVlezi.release();
  96.  
  97.  
  98.  
  99.            
  100.            
  101.             //seEVoRed.acquire();
  102.             //hMax.release();
  103.  
  104.         }
  105.  
  106.     }
  107.  
  108.     public static class Oxygen extends TemplateThread {
  109.  
  110.         public Oxygen(int numRuns) {
  111.             super(numRuns);
  112.         }
  113.  
  114.         @Override
  115.         public void execute() throws InterruptedException {
  116.  
  117.             oMax.acquire();
  118.            
  119.             oNapraveno.release();
  120.            
  121.             hNapraveno.acquire();
  122.            
  123.             state.bondOH();
  124.            
  125.             ohNapraveno.release();
  126.  
  127.            
  128.             alNapraveno.acquire();
  129.            
  130.             //synchronized(AluminiumHydroxide.class) {
  131.                 state.bondAlOH3();
  132.                 oVlezi.release();
  133.             //}
  134.  
  135.  
  136.            
  137.             //seEVoRed.acquire();
  138.             //oMax.release();
  139.  
  140.         }
  141.  
  142.     }
  143.  
  144.     public static class Aluminium extends TemplateThread {
  145.  
  146.         public Aluminium(int numRuns) {
  147.             super(numRuns);
  148.         }
  149.  
  150.         @Override
  151.         public void execute() throws InterruptedException {
  152.            
  153.            
  154.             alMax.acquire();
  155.            
  156.             ohNapraveno.acquire(6);
  157.            
  158.             alNapraveno.release(6);
  159.            
  160.             //synchronized(AluminiumHydroxide.class) {
  161.                 state.bondAlOH3();
  162.             //}
  163.            
  164.             oVlezi.acquire(3);
  165.             hVlezi.acquire(3);
  166.             state.validate();
  167.            
  168.            
  169.             //seEVoRed.release(6);
  170.             oMax.release(3);
  171.             hMax.release(3);
  172.             alMax.release();
  173.            
  174.  
  175.         }
  176.  
  177.     }
  178.  
  179.     static AluminiumHydroxideState state = new AluminiumHydroxideState();
  180.  
  181.     public static void main(String[] args) {
  182.         for (int i = 0; i < 10; i++) {
  183.             run();
  184.         }
  185.     }
  186.  
  187.     public static void run() {
  188.         try {
  189.             int numRuns = 1;
  190.             int numScenarios = 300;
  191.  
  192.             HashSet<Thread> threads = new HashSet<Thread>();
  193.  
  194.             for (int i = 0; i < numScenarios; i++) {
  195.                 Oxygen o = new Oxygen(numRuns);
  196.                 Hydrogen h = new Hydrogen(numRuns);
  197.                 threads.add(o);
  198.                 if (i % 3 == 0) {
  199.                     Aluminium al = new Aluminium(numRuns);
  200.                     threads.add(al);
  201.                 }
  202.                 threads.add(h);
  203.             }
  204.  
  205.             init();
  206.  
  207.             ProblemExecution.start(threads, state);
  208.             System.out.println(new Date().getTime());
  209.         } catch (Exception ex) {
  210.             ex.printStackTrace();
  211.         }
  212.     }
  213.  
  214. }
  215.  
  216. public class AluminiumHydroxideState extends AbstractState {
  217.  
  218.     private static final String DONE_SHOULD_CALLED_ONCE = "The validate() method should be called only once per molecule.";
  219.     private static final String OH_BONDING_NOT_PARALLEL = "The OH bonding is not in parallel!";
  220.     private static final String MOLECULE_NOT_BOUNDED_COMPLITELY = "The previous molecule is not bonded completely.";
  221.     private static final String OH_3_GROUP_IS_NOT_PRESENT = "(OH)3 group is not present.";
  222.     private static final String MAXIMUM_3_OXYGEN = "Maximum 3 Oxygen atoms for bonding are allowed.";
  223.     private static final String MAXIMUM_3_HYDROGEN = "Maximum 3 TribeMember atoms for bonding are allowed.";
  224.     private static final String MAXIMUM_1_ALUMINIUM = "Maximum 1 Aluminium atom for bonding is allowed.";
  225.     private static final int MAXIMUM_1_ALUMINIUM_POINTS = 5;
  226.     private static final int MAXIMUM_3_HYDROGEN_POINTS = 5;
  227.     private static final int MAXIMUM_3_OXYGEN_POINTS = 5;
  228.     private static final int OH_3_GROUP_IS_NOT_PRESENT_PONTS = 5;
  229.     private static final int MOLECULE_NOT_BOUNDED_COMPLITELY_POINTS = 10;
  230.     private static final int OH_BONDING_NOT_PARALLEL_POINTS = 5;
  231.     private static final int DONE_SHOULD_CALLED_ONCE_POINTS = 5;
  232.  
  233.     int numAtoms = 0;
  234.     private BoundCounterWithRaceConditionCheck O;
  235.     private BoundCounterWithRaceConditionCheck H;
  236.     private BoundCounterWithRaceConditionCheck Al;
  237.  
  238.     public AluminiumHydroxideState() {
  239.         O = new BoundCounterWithRaceConditionCheck(0, 3,
  240.                 MAXIMUM_3_OXYGEN_POINTS, MAXIMUM_3_OXYGEN, null, 0, null);
  241.         H = new BoundCounterWithRaceConditionCheck(0, 3,
  242.                 MAXIMUM_3_HYDROGEN_POINTS, MAXIMUM_3_HYDROGEN, null, 0, null);
  243.         Al = new BoundCounterWithRaceConditionCheck(0, 1,
  244.                 MAXIMUM_1_ALUMINIUM_POINTS, MAXIMUM_1_ALUMINIUM, null, 0, null);
  245.     }
  246.  
  247.     public void bondOH() {
  248.  
  249.         Switcher.forceSwitch(3);
  250.         if (getThread() instanceof Oxygen) {
  251.             log(O.incrementWithMax(false), "Oxygen for OH group");
  252.         } else if (getThread() instanceof Hydrogen) {
  253.             log(H.incrementWithMax(false), "TribeMember for OH group");
  254.         }
  255.     }
  256.  
  257.     public void bondAlOH3() {
  258.         synchronized (this) {
  259.             // first check
  260.             if (numAtoms == 0) {
  261.                 if (O.getValue() == 3 && H.getValue() == 3) {
  262.                     O.setValue(0);
  263.                     H.setValue(0);
  264.                 } else {
  265.                     log(new PointsException(OH_3_GROUP_IS_NOT_PRESENT_PONTS,
  266.                             OH_3_GROUP_IS_NOT_PRESENT), null);
  267.                 }
  268.             }
  269.             numAtoms++;
  270.         }
  271.         Switcher.forceSwitch(3);
  272.         if (getThread() instanceof Oxygen) {
  273.             log(O.incrementWithMax(false), "Oxygen for Al(OH)3");
  274.         } else if (getThread() instanceof Hydrogen) {
  275.             log(H.incrementWithMax(false), "TribeMember for Al(OH)3");
  276.         } else {
  277.             log(Al.incrementWithMax(false), "Aluminium for Al(OH)3");
  278.         }
  279.     }
  280.  
  281.     public void validate    () {
  282.         synchronized (this) {
  283.             if (numAtoms == 7) {
  284.                 reset();
  285.                 log(null, "Al(OH)3 molecule is formed.");
  286.             } else if (numAtoms != 0) {
  287.                 log(new PointsException(MOLECULE_NOT_BOUNDED_COMPLITELY_POINTS,
  288.                         MOLECULE_NOT_BOUNDED_COMPLITELY), null);
  289.                 reset();
  290.             } else {
  291.                 log(new PointsException(DONE_SHOULD_CALLED_ONCE_POINTS,
  292.                         DONE_SHOULD_CALLED_ONCE), null);
  293.             }
  294.         }
  295.     }
  296.  
  297.     private synchronized void reset() {
  298.         O.setValue(0);
  299.         H.setValue(0);
  300.         Al.setValue(0);
  301.         numAtoms = 0;
  302.     }
  303.  
  304.     @Override
  305.     public synchronized void finalize() {
  306.         if (O.getMax() == 1 && H.getMax() == 1) {
  307.             logException(new PointsException(OH_BONDING_NOT_PARALLEL_POINTS,
  308.                     OH_BONDING_NOT_PARALLEL));
  309.         }
  310.     }
  311.  
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement