Rivit

Untitled

Oct 22nd, 2020
1,077
136 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.util.ArrayList;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import java.util.Random;
  5. import java.util.stream.IntStream;
  6.  
  7. class Producer extends Thread {
  8.     private final Buffer _buf;
  9.  
  10.     public Producer(Buffer _buf) {
  11.         this._buf = _buf;
  12.     }
  13.  
  14.     public void run() {
  15.         for (int i = 0; i < 100; ++i) {
  16.             _buf.put(i);
  17.         }
  18.     }
  19. }
  20.  
  21. class Consumer extends Thread {
  22.     private final Buffer _buf;
  23.  
  24.     public Consumer(Buffer _buf) {
  25.         this._buf = _buf;
  26.     }
  27.  
  28.     public void run() {
  29.         for (int i = 0; i < 100; ++i) {
  30.             _buf.get();
  31.         }
  32.     }
  33. }
  34.  
  35. class Buffer {
  36.     private final LinkedList<Integer> _buf = new LinkedList<>();
  37.     private final int MAX_ITEMS_IN_BUFFER = 10;
  38.  
  39.     public synchronized void put(int i) {
  40.         while(this._buf.size() >= MAX_ITEMS_IN_BUFFER){
  41.             try {
  42.                 this.wait();
  43.             } catch (InterruptedException e) {
  44.                 e.printStackTrace();
  45.             }
  46.         }
  47.  
  48.         this._buf.add(i);
  49.         System.out.println("Producing " + i);
  50.         this.notify();
  51.     }
  52.  
  53.     public synchronized int get() {
  54.         while(this._buf.isEmpty()){
  55.             try {
  56.                 this.wait();
  57.             } catch (InterruptedException e) {
  58.                 e.printStackTrace();
  59.             }
  60.         }
  61.  
  62.         int v = this._buf.removeFirst();
  63.         System.out.println("Consuming " + v);
  64.         this.notify();
  65.         return v;
  66.     }
  67. }
  68.  
  69. public class PKmon {
  70.     public static void main(String[] args) {
  71. //        runCase(1, 1); // n1 = n2 = 1
  72.         runCase(5, 2); // n1 > n2
  73. //        runCase(5, 5); // n1 = n2 = 5
  74. //        runCase(2, 5); // n1 < n2
  75.  
  76.     }
  77.  
  78.     public static void runCase(int n1, int n2){
  79.         Buffer buffer = new Buffer();
  80.         var threadList = new ArrayList<Thread>();
  81.         IntStream.range(0, n1).forEach(i -> threadList.add(new Producer(buffer)));
  82.         IntStream.range(0, n2).forEach(i -> threadList.add(new Consumer(buffer)));
  83.         threadList.forEach(Thread::start);
  84.  
  85.         threadList.forEach(t -> {
  86.             try{
  87.                 t.join();
  88.             }catch (Exception e){
  89.                 e.printStackTrace();
  90.             }
  91.         });
  92.     }
  93. }
RAW Paste Data