'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:
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 |