Warum wird mein Thread nicht mehr, wenn ich versuche, eine synchronisierte Liste zuzugreifen?

StackOverflow https://stackoverflow.com/questions/1824768

  •  22-07-2019
  •  | 
  •  

Frage

Aus irgendeinem Grunde die Ausgabe folgendermaßen aus:

 public void msgNeedParts() {
    // Blabla...
    System.out.println(name + ": Try to print 'tasks'...");
    synchronized(tasks) {
        System.out.println(name + ": Tasks--" + tasks);
        System.out.println(name + ": Did I manage to print it?");
        tasks.add(new BinToDump(feeder, binNum));
    }
    stateChanged();
 }

druckt einfach out „GantryAgent: Try‚Aufgaben‘... drucken“, aber keine der folgenden Meldungen. Ich bin der Faden zu raten irgendwie ‚stecken bleibt‘ beim Versuch, die synchronisierte Liste ‚Aufgaben‘ zugreifen zu können, aber ich weiß nicht, warum dies geschieht.

'Aufgaben' wurde wie folgt deklariert und initialisiert:

private List<BinToDump> tasks = 
    Collections.synchronizedList(new ArrayList<BinToDump>());

Kann jemand darauf hinweisen, was mir fehlt?

Ah! Ich vermute, ich kann einen Täter haben:

    /* If nothing left to do, return to original position. */

    synchronized (tasks) {

        if (tasks.isEmpty()) {

            doReturnToOriginalPos();

        }

    }

In meinem Scheduler (dies ist ein Agent-Design), überprüfe ich, ob ‚Aufgaben‘ ist leer, um zu sehen, dann rufe ich doReturnToOriginalPos (). Vielleicht nur dies geschieht immer und immer so schnell, dass andere Methoden es keine Chance bekommen zu ändern?

Das war in der Tat das Problem! Es hielt sich so schnell in meinem Planer immer genannt, dass nichts anderes ‚Aufgaben‘ zugreifen können. Vielen Dank an Alle für die Hilfe!

War es hilfreich?

Lösung

Etwas hat eine Sperre auf Aufgaben. Je nachdem, welche Art von Anwendung ist dies, sollten Sie in der Lage sein, ein vollständiges Stapelabbild des Systems zu erhalten, aber die Methode variiert. Zum Beispiel denke ich, CTRL-Break auf den meisten Windows-basierten appservers wird dies tun, und ich denke, ein SIGQUIT auf Linux senden, wird das gleiche tun.

Wenn Sie einen Stack Dump zu erhalten, können Sie durch sie schauen, um zu versuchen und herausfinden, welche anderen Thread für das Objekt eine Sperre hat.

Sie können auch verwenden VisualVM ein Stapelabbild, für das gleiche Endziel zu bekommen:

  

Sie können Java VisualVM verwenden eine nehmen   Faden dump (Stapelüberwachung), während ein   lokale Anwendung ausgeführt wird. Ein Nehmen   Thread-Dump stoppt nicht die   Anwendung. Beim Drucken des Fadens   Dump Sie einen Ausdruck des Fadens erhalten   Stapel, der Thread-Zustände umfasst zum   die Java-Threads.

     

Wenn Sie drucken ein Thread-Dump in Java   VisualVM, druckt das Werkzeug einen Stapel   Spur des aktiven Threads der   Anwendung. Mit Java VisualVM zu   nehmen Sie einen Thread-Dump kann sehr   in den Fällen, bequem, wo Sie dies nicht tun   eine Befehlszeilenkonsole für den   Anwendung. Sie können einen Stack-Trace verwenden   zu helfen, eine Reihe von Fragen zu diagnostizieren   wie Deadlocks oder wenn ein   Anwendung hängt.

Andere Tipps

Ist es möglich, dass ein anderer Thread eine Synchronisierungssperre gegen tasks hält?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top