Я пытаюсь реализовать ждать() и поставить в известность() внутри моих программ, которые имеют многопоточность (более одного потока уведомляют и ждут).
Проблемы
Бывает, когда два потока ждать(), в то время как я поставить в известность(), оба просыпаются, что делает Только одни данные, и нужно делать оба потока, и результат один поток выигрывает, потоки, которые проигрывают, ничего не получат НОЛЬ.
Это только мое мнение, в вашем случае может быть иначе, так как это происходит только в многопоточной среде
Причина
Я мог бы реализовать поставить в известность() неправильно и т.д., я мог бы не знать, и это происходит только как Выполнено 20 раз, единовременная ошибка.
Код
//Single Threads
/*
As seen here I am using single threads, and
if there is error, Depot Enter will shows error,
if no error means there is a data
*/
bus = (Bus) ((LinkedList<?>) Shop.ListBusRamp).poll();
System.out.println("Depot Enter: " + bus.getBusName());
/*
In here I want to pass the value into another Linked List
As earlier there is a value that I just poll.
I can offer here and pass the value, no NULL occurred yet.
*/
((LinkedList<Bus>) ListBusDepot).offer(bus);
synchronized (ListBusDepot) {
ListBusDepot.notify();
}
Как видно здесь, я хочу передать значение из СписокАвтобус в ListBusDepot, как видно здесь, NULL еще не произошло, все в порядке.
//MULTI THREADS (2 THREADS TO BE EXACT)
/*
Here I want to wait for the data passed by notify
After I got the data, I want to show it.
As for why I check of Cleaners < 2?
I create so that NOT ALL can enter, only when size is 2
*/
synchronized (ListBusDepot) {
while (ListBusDepot.size() == 0) {
try {
ListBusDepot.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//VALUE MUST NOT NULL IF REACHES HERE
bus = (Bus) ((LinkedList<?>) Shop.ListBusDepot).peek();
if (counter.getBus_Cur_Cleaners() < 2) {
counter.remBus_Cur_Depot();
counter.addBus_Cur_Mechanics();
//Here is the problem, while accessing data, it will show NULL
System.out.println("Mechanics Earlier: " + bus.getBusName() + " fixed by" + name);
bus = (Bus) ((LinkedList<?>) Shop.ListBusDepot).poll();
}
}
Как видно здесь, возникает NULL, и как его предотвратить, все, что мне нужно, это если он по-прежнему нулевой (пустой), не выходите из цикла, пока ждете




Happens when two threads wait(), while I am notify(), both of them wake
Нет, только один проснется. notifyAll разбудит обоих.
Вы синхронизируете ListBusDepot
while (ListBusDepot.size() == 0)
но попробуй взять от Shop.ListBusDepot
bus = (Bus) ((LinkedList<?>) Shop.ListBusDepot).peek();
вот почему bus равен нулю.
Рассмотрите возможность использования BlockigQueue, он будет обрабатывать wait и notify за вас, так что вы можете просто сосредоточиться на своей бизнес-логистике.
@JoesLie Тогда вы можете опубликовать полный код. Этот код выглядит неплохо.
Да, это происходит случайно, в зависимости от удачи. что ужасно. Итак, есть ли способ проверить, пуст ли он, и можно продолжить. Для всего кода это один и тот же шаг - опрос уведомлений из одного списка в другой.
@JoesLie Насколько я понимаю, ваш код может убедиться, что bus не является null.
Привет, спасибо за ответ. Shop.ListBusDepot и ListBusDepot - это одно и то же, все они в классе магазина, да, я бы хотел использовать
BlockingQueue, но это академическая цель, мне нужно использовать традиционный метод.