Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Примерът предлага коректно решение на задачата "писател" - "читател" */
- /* Съгласуването на опрациите "запис" и "четене" става с методите wait() */
- /* и notify() */
- class Quantity2 {
- int buffer; // Буфер - критичен ресурс
- boolean valueSet = false; // Флаг - поставена ли е стойност в буфера
- // Получаване на стойност от буфера
- synchronized int get() {
- if (!valueSet)
- try {
- System.out.println ("Waiting for getting!");
- wait(); // Чакаме поставяне на стойност в буфера и деблокиране на нишката "читател"
- }
- catch(InterruptedException e) {};
- System.out.println("Got: " + buffer);
- valueSet = false;
- notify(); // Буферът е прочетен - деблокираме нишката "Писател"
- return buffer;
- }
- // Поставяне на стойност в буфера
- synchronized void put(int n) {
- if (valueSet)
- try {
- System.out.println ("Waiting for putting! n = " + n);
- wait(); // Чакаме прочитане на стойността от буфера и деблокиране на нишката "писател"
- }
- catch(InterruptedException e) {};
- buffer = n;
- valueSet = true;
- System.out.println("Put: " + n);
- notify(); // Стойността е в буфера - деблокираме нишката "Читател"
- }
- }
- // Нишка "писател"
- class Producer implements Runnable {
- Quantity2 q;
- Producer(Quantity2 q) {
- this.q = q;
- new Thread(this, "Producer").start();
- }
- public void run() { // Прави опит да запише 20 стойности в буфера
- for (int i = 0; i < 20; i++) {
- q.put((int) (Math.random() *10));
- }
- }
- }
- // Нишка "читател"
- class Consumer implements Runnable {
- Quantity2 q;
- Consumer(Quantity2 q) {
- this.q = q;
- new Thread(this, "Consumer").start();
- }
- public void run() { // Постоянно опитва да чете от буфера
- while (true) {
- q.get();
- }
- }
- }
- class PC { // Тестов клас за илюстриране на задачата
- public static void main(String args[]) {
- Quantity2 q = new Quantity2();
- new Producer(q); // Създаваме "писател" за ресурса в q
- new Consumer(q); // създаваме "читател" за ресурса в q
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment