Advertisement
Karenira

PAI- zadanie 3

Apr 3rd, 2020
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.89 KB | None | 0 0
  1. package zad3;
  2.  
  3. class Producent implements Runnable {
  4.     public static boolean dziala = true;
  5.     private Magazyn magazyn;
  6.     public final String nazwa;
  7.  
  8.     public Producent(String naz, Magazyn mag){
  9.         nazwa = naz;
  10.         magazyn = mag;
  11.     }
  12.  
  13.     @Override
  14.     public void run(){
  15.         try {
  16.             while(dziala){
  17.             magazyn.wstaw((int) (Math.random() * 10), this.nazwa);
  18.             Thread.sleep((long) (Math.random() * 1000));}
  19.         } catch (InterruptedException e) {
  20.             Thread.currentThread().interrupt();
  21.             //e.printStackTrace();
  22.         }
  23.     }
  24.  
  25.     /* możliwe zamykanie wątków na siłę
  26.     public void stop() {
  27.         dziala = false;
  28.     }*/
  29. }
  30.  
  31. class Konsument implements Runnable {
  32.     public static boolean dziala = true;
  33.     private Magazyn magazyn;
  34.     public final String nazwa;
  35.  
  36.     public Konsument(String naz, Magazyn mag) {
  37.         nazwa = naz;
  38.         magazyn = mag;
  39.     }
  40.  
  41.     @Override
  42.     public void run() {
  43.         try {
  44.             while (dziala) {
  45.                 magazyn.usun(this.nazwa);
  46.                 Thread.sleep((long) (Math.random() * 1000));
  47.             }
  48.         } catch (InterruptedException e) {
  49.             Thread.currentThread().interrupt();
  50.             //e.printStackTrace();
  51.         }
  52.     /*}
  53.     public void stop() {
  54.         dziala = false;
  55.     }*/
  56.     }
  57. }
  58.  
  59. class Magazyn {
  60.     private int[] tab;
  61.     private int pocz, ile;
  62.  
  63.     public Magazyn(int n) {
  64.         if (n < 1 || n > 10) throw new IllegalArgumentException("Niewłaściwa pojemność magazynu.");
  65.         tab = new int[n];
  66.     }
  67.     public synchronized boolean pusty() {
  68.         return ile == 0;
  69.     }
  70.     public synchronized boolean pelny() {
  71.         return ile == tab.length;
  72.     }
  73.  
  74.     public synchronized void wstaw(int x, String n) throws InterruptedException {
  75.         while (pelny()) {         //pętla nieskończona jeśli konsument zakończy się pierwszy
  76.             System.out.println(n + " oczekuje na opróżnienie magazynu.");
  77.             wait();}
  78.         tab[(pocz + ile) % tab.length] = x;
  79.         ile++;
  80.         System.out.println(n + " wstawił liczbę " + x + " do magazynu.");
  81.         notifyAll();
  82.     }
  83.  
  84.     public synchronized int usun(String s) throws InterruptedException {
  85.         while (pusty()) {          //pętla nieskończona jeśli producent zakończy się pierwszy
  86.             System.out.println(s + " oczekuje na zapełnienie magazynu.");
  87.             wait();
  88.         }
  89.         int x = tab[pocz];
  90.         pocz = (pocz + 1) % tab.length;
  91.         ile--;
  92.         System.out.println(s + " pobrał liczbę " + x +" z magazynu.");
  93.         notifyAll();
  94.         return x;
  95.     }
  96. }
  97. package zad3;
  98.  
  99. public class Main {
  100.  
  101.  
  102.     public static void main(String[] args) throws InterruptedException {
  103.  
  104.         System.out.println("=====START=====");
  105.         Magazyn magazyn = new Magazyn(4);
  106.         Thread p1 = new Thread(new Producent("Prod-1", magazyn));
  107.         Thread p2 = new Thread(new Producent("Prod-2", magazyn));
  108.         Thread k1 = new Thread(new Konsument("Kons-1", magazyn));
  109.         Thread k2 = new Thread(new Konsument("Kons-2",magazyn));
  110.         p1.start();
  111.         k1.start();
  112.         p2.start();
  113.         k2.start();
  114.         for (int i = 10; i > 0; i--) {
  115.             Thread.sleep(1000);
  116.         }
  117.         //rozwiązanie nie jest idealne, w przypadku gdy jest więcej producentów niż konsumentów
  118.         //lub odwrotnie
  119.         Producent.dziala = false;
  120.         Konsument.dziala = false;
  121.         p1.interrupt();
  122.         p2.interrupt();
  123.         k1.interrupt();
  124.         k2.interrupt();
  125.         p1.join();
  126.         p2.join();
  127.         k1.join();
  128.         k2.join();
  129.         /* bardzo brzydkie rozwiązanie zamykania wątków na siłę
  130.         p1.stop();
  131.         p2.stop();
  132.         k1.stop();
  133.         k2.stop() */
  134.         System.out.println("=====STOP=====");
  135.     }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement