В интернете нашел пример использования wait
и notify
:
public class ThreadsApp {
public static void main(String[] args) {
Store store = new Store();
Producer producer = new Producer(store);
Consumer consumer = new Consumer(store);
new Thread(producer).start();
new Thread(consumer).start();
}
}
// Класс Магазин, хранящий произведенные товары
class Store {
private int product = 0;
private boolean available = false;
public synchronized void get() {
while (product < 1) {
try {
wait();
} catch (InterruptedException e) {
}
}
product--;
System.out.println("Покупатель купил 1 товар");
System.out.println("Товаров на складе: " + product);
notify();
}
public synchronized void put() {
while (product >= 3) {
try {
wait();
} catch (InterruptedException e) {
}
}
product++;
System.out.println("Производитель добавил 1 товар");
System.out.println("Товаров на складе: " + product);
notify();
}
}
// класс Производитель
class Producer implements Runnable {
Store store;
Producer(Store store) {
this.store = store;
}
public void run() {
for (int i = 1; i < 6; i++) {
store.put();
}
}
}
// Класс Потребитель
class Consumer implements Runnable {
Store store;
Consumer(Store store) {
this.store = store;
}
public void run() {
for (int i = 1; i < 6; i++) {
store.get();
}
}
}
Вопрос:
В реализации методов get
и put
есть метод notify
, который будит потоки, спящие на мониторе store
, и это происходит каждый раз при их вызове, т.е. когда поток покупатель купил товар и вызвал notify
в методе get
, поток производитель на этом же мониторе УЖЕ ПРОСНУЛСЯ И ЖДЕТ ОСВОБОЖДЕНИЯ МОНИТОРА?
Так как вызывается несколько раз notify
, потому что вызывается несколько раз get
и put
, столько же раз происходит пробуждение потоков на мониторе, получается поток уже проснулся, и его еще 2 раза будят - как это с точки зрения правильности?
notify
- будит только 1 поток и не известно какой именно.notify
ничего не делает.Попробую пояснить подробно.
wait
, засыпает и освобождает lock.notify
. Возможно (так как не известно какой поток будет разбужен) поток А просыпается становится в очередь на захват lock.wait
выражения.Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Опять нужна помощьПри первом запуске только что написанного кода проблем нет
Требуется библиотека java для обработки изображенияТребуется возможность создания, попиксельного редактирования и сохранения изображения...