Работает внутри синхронизированного (это) приводит к сбою приложения

Мой код:

@Override
  public void loadingDone(int whatIsDone) {
    if (interrupt) {
      return;
    } 
    synchronized (this) {
      // 1 - loaded with visu
      // 2 - loaded without visu
      switch (whatIsDone) {
      case 1: // view.setLoading(true);
        if (!view.isLoading()) {
          //view.setStatusLineMsg(msg);
        }
        break;
      case 3:
        view.getParent().getDisplay().asyncExec(new Runnable() {          
          @Override
          public void run() {
            if ( view != null && view.isPmiUseModelviewAtStartup() ) {
              try {
                Thread.sleep(100);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
              view.changeModelViewBySUModelViewRegex();
            }
          }
        });
        view.setLoading(true);

        // other code
            
      case 4: // other code
        
      default:
      case 2:
        view.setLoading(true);
        break;
      }
    }
  }

Внутри case 3 метод view.changeModelViewBySUModelViewRegex() вызывает другой метод:

public Long[] getReferenceIdsColumn()
{
  Long[] ret = null;

  System.out.println("TreeDataItem.getReferenceIdsColumn()->"
    + "Object referenceIds = TCA3DNKernel.getModelItemAttrValue(getModelId(), getId(), TCA3DNModelDataColumn.ReferenceIdsColumn)");
  Object referenceIds = TCA3DNKernel.getModelItemAttrValue(getModelId(), getId(), TCA3DNModelDataColumn.ReferenceIdsColumn);
  //System.out.println("TreeDataItem.getReferenceIdsColumn(->if (referenceIds != null))");
  if (referenceIds != null)
  {
    if (referenceIds instanceof Long[])
    {
      ret = (Long[]) referenceIds;
    }
  }
  return ret;
}

Приложение вылетает при запуске: Object referenceIds = TCA3DNKernel.getModelItemAttrValue(getModelId(), getId(), TCA3DNModelDataColumn.ReferenceIdsColumn). getModelItemAttrValue написан в коде C++.

Я могу исправить это, увеличив спящий поток внутри case 3, поэтому проблема должна быть не в коде (java или C++), а в синхронизации потоков? Если я использую точки останова во время отладки, кажется, что потоки успевают завершить задачи, и приложение не падает. В любом случае, это определенно жуткое решение:

if ( view != null && view.isPmiUseModelviewAtStartup() ) {
    try {
      Thread.sleep(1500);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    view.changeModelViewBySUModelViewRegex();
}

Скриншоты:

Работает внутри синхронизированного (это) приводит к сбою приложенияРаботает внутри синхронизированного (это) приводит к сбою приложенияРаботает внутри синхронизированного (это) приводит к сбою приложения

Буду признателен за любое лучшее решение!

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

Ответы 1

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

Кажется, что вместо asyncExec помогает синхронизированный:

case 3:
  view.getParent().getDisplay().syncExec(new Runnable() {
    //code
  }

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