|
| 1 | + |
| 2 | +//If then you have judgments of things pertaining to this life, set them to judge who are least esteemed in the church. (1Cor 6:4) |
| 3 | + |
| 4 | +package com.javarush.task.task27.task2709; |
| 5 | + |
| 6 | +public class TransferObject { |
| 7 | + private int value; |
| 8 | + protected volatile boolean isValuePresent = false; //use this variable |
| 9 | + |
| 10 | + public synchronized int get() { |
| 11 | + while (!isValuePresent) { |
| 12 | + try { |
| 13 | + this.wait(); |
| 14 | + } catch (InterruptedException e) { |
| 15 | + } |
| 16 | + } |
| 17 | + System.out.println("Got: " + value); |
| 18 | + isValuePresent = false; |
| 19 | + try {return value;} |
| 20 | + finally { |
| 21 | + notifyAll(); |
| 22 | + } |
| 23 | + } |
| 24 | + |
| 25 | + public synchronized void put(int value) { |
| 26 | + while (isValuePresent) { |
| 27 | + try { |
| 28 | + this.wait(); |
| 29 | + } catch (InterruptedException e) { |
| 30 | + } |
| 31 | + } |
| 32 | + this.value = value; |
| 33 | + System.out.println("Put: " + value); |
| 34 | + isValuePresent = true; |
| 35 | + notifyAll(); |
| 36 | + } |
| 37 | +} |
| 38 | +/* |
| 39 | +Producer–consumer |
| 40 | +В классе TransferObject расставь вызовы методов wait/notify/notifyAll, чтобы обеспечить последовательное создание и получение объекта. |
| 41 | +В методах run классов ConsumerTask и ProducerTask создай необходимые synchronized блоки. |
| 42 | +
|
| 43 | +Ожидаемый вывод: |
| 44 | +... |
| 45 | +Put: M |
| 46 | +Got: M |
| 47 | +Put: N |
| 48 | +Got: N |
| 49 | +Put: K |
| 50 | +Got: K |
| 51 | +... |
| 52 | +где M, N, K — числа |
| 53 | +Метод main не участвует в тестировании |
| 54 | +
|
| 55 | +P.S. Всегда старайся использовать concurrent коллекции вместо ручной реализации wait/notify/notifyAll. |
| 56 | +Задачи подобные этой позволяют лучше понять основы работы многопоточных приложений. |
| 57 | +
|
| 58 | +
|
| 59 | +Требования: |
| 60 | +1. В методе run класса ConsumerTask должен содержаться synchronized блок, монитор - transferObject. |
| 61 | +2. В методе run класса ProducerTask должен содержаться synchronized блок, монитор - transferObject. |
| 62 | +3. Метод get класса TransferObject должен ждать появления value, и возвращать его после того, как оно появится. |
| 63 | +4. Метод put класса TransferObject должен ждать пока value заберут и обновлять его значение после того, как оно пропадет. |
| 64 | +5. Метод get класса TransferObject должен устанавливать флаг isValuePresent в false и уведомлять другие нити ожидающие освобождения монитора перед возвратом значение поля value. |
| 65 | +6. Метод put класса TransferObject должен устанавливать флаг isValuePresent в true и уведомлять другие нити ожидающие освобождения монитора после обновления значение поля value. |
| 66 | +*/ |
0 commit comments