VasilM

synchronized_threads

May 28th, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.66 KB | None | 0 0
  1. /* Примерът предлага коректно решение на задачата "писател" - "читател"   */
  2. /* Съгласуването на опрациите "запис" и "четене" става с методите wait()  */
  3. /* и notify()                                                             */
  4. class Quantity2 {
  5.     int buffer; // Буфер - критичен ресурс
  6.     boolean valueSet = false; // Флаг - поставена ли е стойност в буфера
  7.    
  8.     // Получаване на стойност от буфера
  9.     synchronized int get() {
  10.        if (!valueSet)
  11.          try {
  12.             System.out.println ("Waiting for getting!");
  13.             wait();  // Чакаме поставяне на стойност в буфера и деблокиране на нишката "читател"
  14.        }
  15.        catch(InterruptedException e) {};
  16.        System.out.println("Got: " + buffer);
  17.        valueSet = false;
  18.        notify();  // Буферът е прочетен - деблокираме нишката "Писател"
  19.        return buffer;
  20.     }
  21.  
  22.     // Поставяне на стойност в буфера
  23.     synchronized void put(int n) {
  24.        if (valueSet)
  25.          try {
  26.             System.out.println ("Waiting for putting! n = " + n);
  27.             wait();  // Чакаме прочитане на стойността от буфера и деблокиране на нишката "писател"
  28.        }
  29.        catch(InterruptedException e) {};
  30.        buffer = n;
  31.        valueSet = true;
  32.        System.out.println("Put: " + n);
  33.        notify();  // Стойността е в буфера - деблокираме нишката "Читател"
  34.     }
  35. }
  36.  
  37.  
  38. // Нишка "писател"
  39. class Producer implements Runnable {
  40.     Quantity2 q;
  41.     Producer(Quantity2 q) {
  42.         this.q = q;
  43.         new Thread(this, "Producer").start();
  44.     }
  45.  
  46.     public void run() {  // Прави опит да запише 20 стойности в буфера
  47.  
  48.         for (int i = 0; i < 20; i++) {
  49.             q.put((int) (Math.random() *10));
  50.         }
  51.     }
  52. }
  53.  
  54.  
  55. // Нишка "читател"
  56. class Consumer implements Runnable {
  57.     Quantity2 q;
  58.     Consumer(Quantity2 q) {
  59.         this.q = q;
  60.         new Thread(this, "Consumer").start();
  61.     }
  62.  
  63.     public void run() {  // Постоянно опитва да чете от буфера
  64.         while (true) {
  65.             q.get();
  66.         }
  67.     }
  68. }
  69.  
  70. class PC {  // Тестов клас за илюстриране на задачата
  71.     public static void main(String args[]) {
  72.         Quantity2 q = new Quantity2();
  73.         new Producer(q);  // Създаваме "писател" за ресурса в q
  74.         new Consumer(q);  // създаваме "читател" за ресурса в q
  75.     }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment