'Runnable inside synchronized (this) leads to app crash

My code is:

@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;
      }
    }
  }

Inside case 3, method view.changeModelViewBySUModelViewRegex() calls another method:

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;
}

App crashes when running: Object referenceIds = TCA3DNKernel.getModelItemAttrValue(getModelId(), getId(), TCA3DNModelDataColumn.ReferenceIdsColumn). getModelItemAttrValue is written in C++ code.

I can fix this by increasing thread sleep inside case 3, so there should not be problem in code (java or C++), but problem of threads synchronization? If I use breakpoints while debugging, seems that threads have time to finish tasks and app do not crash. Anyway, this is definitely creepy solution:

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

Screenshots:

breakpoint 1 breakpoint 2 GUI message

I would be thankful for any better solution!



Solution 1:[1]

Seems, that instead of asyncExec, synchronized one helps:

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 stojelenov