Advertisement
ivana_andreevska

Sinhronizacija Primer Zadaci 1

Aug 19th, 2022
494
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.39 KB | None | 0 0
  1. package AV3ZADACI;
  2.  
  3. import javax.naming.ldap.Control;
  4. import java.util.concurrent.Semaphore;
  5.  
  6. public class ProducerController {
  7.  
  8.     public static int NUM_RUN = 50;
  9.  
  10.     static Semaphore accessBuffer; //semafor koj go ogranicuva pristapot do baferot koj ni e spodelen resurs(kriticen domen)
  11.     static Semaphore lock; //semafor koj go ogranicuva pristapot do promenilivata numChecks
  12.     static Semaphore canCheck; //semafor koj proveruva dali samo 10 threada kako barano pravat proverka na odreden item,ni osigura deka 10 threda od klasata kontroler pravat proverka na baferot
  13.  
  14.  
  15.     public static void init() {
  16.         //da se inicijaliziraat site semafori
  17.         accessBuffer = new Semaphore(1);
  18.         //ima 1 dozvola na pocetokot bidejki vo 1 moment samo kontrolerot ili samo producerot moze da pristapi do baferot
  19.         lock = new Semaphore(1);
  20.         //bilo koj od kontrolerite moze samo vo 1 moment da pristapi do numCHecks i da pristapi do zastitentiot del t.e baferot
  21.         canCheck = new Semaphore(10);
  22.         //10 permisii oti 10 kontroleri moze da pristapuvaat
  23.     }
  24.  
  25.     public static class Buffer {
  26.         public int numChecks = 0;
  27.  
  28.         public void produce() {
  29.             System.out.println("Producer is producing..");
  30.         }
  31.  
  32.         public void check() {
  33.             System.out.println("Controller is checking");
  34.         }
  35.     }
  36.  
  37.     public static class Prodcuer extends Thread {
  38.         private final Buffer buffer;
  39.  
  40.         public Prodcuer(Buffer b) {
  41.             this.buffer = b;
  42.         }
  43.  
  44.         public void execute() throws InterruptedException {
  45.             //sinhronizacija na metodot execute od producer koj go povikuva produce
  46.             //spodeleniot resurs e zasitetn so semafo rkoj e zastiten so access buffer
  47.             accessBuffer.acquire(); //cekame da dobieme poraka dali resursot e sloboden,koga ke doznaeme deka resursot e sloboden toa znaci deka producerot momentalno moze da go koristi baferot namesto kontroler
  48.             //sega slobodno moze da povika metod koj proizveduva stavki(uloga na producer) bidejki se noaoga v baferot
  49.             this.buffer.produce();
  50.             //bufer e spodelena promenliva kade se naoga metodot produce zatoa prvo pristapuvame do baferot za preku nego da dojdeme do produce
  51.             //otkako producerot zavrsuva so rabota toj treba da go oslobodi resursot za dr da rabotat so nego
  52.             accessBuffer.release();
  53.         }
  54.  
  55.         public void run() {
  56.             for (int i = 0; i < NUM_RUN; i++) {
  57.                 try {
  58.                     execute();
  59.                 } catch (InterruptedException e) {
  60.                     e.printStackTrace();
  61.                 }
  62.             }
  63.         }
  64.     }
  65.  
  66.     public static class Controller extends Thread {
  67.         private final Buffer buffer;
  68.  
  69.         public Controller(Buffer buffer) {
  70.             this.buffer = buffer;
  71.         }
  72.  
  73.         public void execute() throws InterruptedException {
  74.             lock.acquire(); //ja stiteme num check
  75.             //zavrsuvame so producer prodolzuvame so controller
  76.             //numCHecks e vo buffer i zatoa preku buffer pristapuvame do nea
  77.             //numchecks probveruva kolku se zainteresirani za baferot atm
  78.             if (this.buffer.numChecks == 0) {
  79.                 //proveruvame za da se osigurame deka producerot ne planira/pravi nesto so baferot
  80.                 accessBuffer.acquire(); //cekame na access bufer da ne izvesti deka smeeme da vlezeme vo baferot
  81.                 this.buffer.check();
  82.                 //controler metod vo bafer kako produce sto e gore
  83.             }
  84. //            if(this.buffer.numChecks>=0){
  85. //            //kontrolerite znaci rabotat sto znaci mozam da se vklucam u proverkata i nemora da proveruvam dali acccessbufer e otvoren
  86. //            this.buffer.check();
  87. //            }
  88.  
  89.             //ako e pogolemo od 0 direktno odi na check vaka e optimizran kodot
  90.             //stom dobieme privilegija za baferot mora da ja zgolemime numCheck
  91.             this.buffer.numChecks++; //da imame informacija kolku tekovni kontroler rabotat
  92.             //mora da ja zastitime numcheck i ODI NAGORE mora da ja zaklucime / zastitieme so lock
  93.             //zavrsivme so rabota ssega go osloboduvame lock semaforot
  94.             lock.release();
  95.  
  96.             //proverka dali semaforot ni dozvoluva da vlezeme vo resursot oti treba da pazime dali preminuvame 10 vleguvanje
  97.  
  98.             canCheck.acquire();  //da sme sigurni dali e pogolem od 10 ili ne
  99.             //otkako ke zavrsi ovaa proverka mora da napravime modifikacija na numcheck i da ja namalime vrednosta na kontroleri koi proveruvaat vo adden moment
  100.  
  101.             this.buffer.check();
  102.             lock.acquire();
  103.             this.buffer.numChecks--;
  104.  
  105.             //mora da proverume za what if situacija koga ke dojde posledniot kontroler
  106.             if (this.buffer.numChecks == 0) {
  107.                 accessBuffer.release();
  108.             }
  109.  
  110.  
  111.             lock.release(); //stavame lock okolu numChecks oti taa ni e bitna promenliva koja mora da bide zastitena
  112.             //canCheck.release(); //osloboduva resurs oti zavrsil so proverka
  113.         }
  114.  
  115.         public void run() {
  116.             for (int i = 0; i < NUM_RUN; i++) {
  117.                 try {
  118.                     execute();
  119.                 } catch (InterruptedException e) {
  120.                     e.printStackTrace();
  121.                 }
  122.             }
  123.         }
  124.     }
  125.  
  126. }
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement