Подождите, уведомить, передать значение NULL Java

Я пытаюсь реализовать ждать() и поставить в известность() внутри моих программ, которые имеют многопоточность (более одного потока уведомляют и ждут).

Проблемы

Бывает, когда два потока ждать(), в то время как я поставить в известность(), оба просыпаются, что делает Только одни данные, и нужно делать оба потока, и результат один поток выигрывает, потоки, которые проигрывают, ничего не получат НОЛЬ.

Это только мое мнение, в вашем случае может быть иначе, так как это происходит только в многопоточной среде

Причина

Я мог бы реализовать поставить в известность() неправильно и т.д., я мог бы не знать, и это происходит только как Выполнено 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, и как его предотвратить, все, что мне нужно, это если он по-прежнему нулевой (пустой), не выходите из цикла, пока ждете

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 за вас, так что вы можете просто сосредоточиться на своей бизнес-логистике.

Привет, спасибо за ответ. Shop.ListBusDepot и ListBusDepot - это одно и то же, все они в классе магазина, да, я бы хотел использовать BlockingQueue, но это академическая цель, мне нужно использовать традиционный метод.

liejoes1 30.04.2018 18:06

@JoesLie Тогда вы можете опубликовать полный код. Этот код выглядит неплохо.

xingbin 30.04.2018 18:07

Да, это происходит случайно, в зависимости от удачи. что ужасно. Итак, есть ли способ проверить, пуст ли он, и можно продолжить. Для всего кода это один и тот же шаг - опрос уведомлений из одного списка в другой.

liejoes1 30.04.2018 18:11

@JoesLie Насколько я понимаю, ваш код может убедиться, что bus не является null.

xingbin 30.04.2018 18:18

Другие вопросы по теме