Ich benutze LibGDX AsyncExecutor und die folgende Funktion wird in einem Hintergrund-Thread aufgerufen. 'tasksForTheMainThread' ist das statische Array von Runnable, das bei jedem Aufruf der Update-Funktion im Haupt-Thread seine noch nicht ausgeführten Elemente ausführt. Die Funktion 'createBox' von 'modelBuilder' erstellt und gibt ein Objekt der Klasse 'Model' zurück.Java: Fest in der While-Schleife im Hintergrund Thread
Kurz erklärt, dieser Code wird im zweiten Thread ausgeführt und sendet einen Code (Funktion 'run()'), der im ersten Thread verwendet werden soll. Nach dem Senden ist der zweite Thread bis zu dem Moment eingefroren, in dem der Code in "run()" abgeschlossen ist und das Model-Objekt erstellt wird (oder zumindest so sein soll).
Es funktioniert jedoch wie erwartet nur, wenn die While-Schleife (die nur wartet, bis das Objekt im Hauptthread erstellt wird) das Protokollierungsbit (Gdx.app.log("TAG","2");
) enthält. Wenn es leer ist, friert der zweite Thread für immer ein und erreicht selbst nach der Erstellung des Model-Objekts nie den Punkt A.
Warum und wie kann die Protokollierung das beeinflussen? Und warum funktioniert das Programm nicht ohne?
void secondThreadFunction()
{
Model model = null;
ChunkManager.tasksForTheMainThread.add(new Runnable()
{
@Override
public void run()
{
model = modelBuilder.createBox(size.x, size.y, size.z, GL20.GL_LINES,
new Material(ColorAttribute.createDiffuse(Color.YELLOW)),
VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
}
});
while (model == null)
{
//Gdx.app.log("TAG","2");
}
//point A
}
Sollte 'Modell' nicht' volatile' sein? Das könnte tatsächlich das Problem sein ... etwas mit parallelen Kernen zu tun und das Logging löst eine Synchronisierung aus. Der zweite Thread tut nichts und erhält vielleicht nie eine aktualisierte Ansicht der Daten, da "Modell" nicht "flüchtig" ist. Außerdem ist der obige Code nicht kompilierbar, da "Modell" kein Mitglied oder "final" ist. – Tenfour04