Skip to content

Commit 4878444

Browse files
authored
u have judgments of things pertaining to this life
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)
1 parent 5c4c6af commit 4878444

1 file changed

Lines changed: 66 additions & 0 deletions

File tree

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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

Comments
 (0)