U
ugh_bough_
Gast
Hallihallo.
Ich habe ein kleines Problem, bei dem ich nicht weiß, woher es resultiert.
1. Deadlock:
Pseudocode:
Grundgedanke:
Der Thread wertet Daten aus, die dann in das in doIt() erwähnte Objekt übergeben werden, welches sie in verschiedenen collections sammelt. doIt() wird also aus dem anonymen Thread und vom Benutzer aus dem Swing-Thread aus aufgerufen, der auch Daten auflisten will.
Problem:
Ab und zu kommt es zu einem Deadlock, den ich mir nicht erklären kann. In den meisten Fällen funktioniert es. Könnte mir auch nicht erklären, daß es irgendwie an Swing läge.
Lösung:
Kann ich einfach darauf verzichten, doIt() synchronized zu machen und statt dessen die Collections in dem benutzen Objekt (nicht im JPanel) synchronized machen? Ich habe diese Lösung sein lassen, da
1. die Daten im die collections beherbergenden Objekt noch in Schleifen verarbeitet werden und
2. ich mir nicht sicher war, ob diese Synchronität sich bis auf die oben gezeigt Ebene (also die Trennung vom Automatik-Thread und dem Benutzer-Thred) durchschlägt.
Danke für Hilfe.
PS: Java 5, falls es doch wichtig ist.
Nun zum Schmankerl:
Ist eigentlich nur eine Interessefrage.
Kann man die einträge der Collection (HashSet hab ich nur als Bsp benutzt) löschen, wärend man mit nem Iterator drüberläuft? Sollte doch eigentlich gehen, oder? Der It macht doch Kopien der Referenzen der in der Collection enthaltenen Objekte, oder nicht?
Ich habe ein kleines Problem, bei dem ich nicht weiß, woher es resultiert.
1. Deadlock:
Pseudocode:
Code:
class MyPanel
extends JPanel
{
//
private synchronized void doIt(arg)
{
... // zugriff auf die methoden eines objekts, welches collections verwaltet
// keine änderung in irgendwelchen swingObjekten
}
private Thread
{
public void run()
{
...
doIt(...); // vom programm aufgerufen
...
}
}
void aButtonWasClicked(ActionEvent e)
{
doIt(...); // vom benutzer aufgerufen
}
}
Grundgedanke:
Der Thread wertet Daten aus, die dann in das in doIt() erwähnte Objekt übergeben werden, welches sie in verschiedenen collections sammelt. doIt() wird also aus dem anonymen Thread und vom Benutzer aus dem Swing-Thread aus aufgerufen, der auch Daten auflisten will.
Problem:
Ab und zu kommt es zu einem Deadlock, den ich mir nicht erklären kann. In den meisten Fällen funktioniert es. Könnte mir auch nicht erklären, daß es irgendwie an Swing läge.
Lösung:
Kann ich einfach darauf verzichten, doIt() synchronized zu machen und statt dessen die Collections in dem benutzen Objekt (nicht im JPanel) synchronized machen? Ich habe diese Lösung sein lassen, da
1. die Daten im die collections beherbergenden Objekt noch in Schleifen verarbeitet werden und
2. ich mir nicht sicher war, ob diese Synchronität sich bis auf die oben gezeigt Ebene (also die Trennung vom Automatik-Thread und dem Benutzer-Thred) durchschlägt.
Danke für Hilfe.
PS: Java 5, falls es doch wichtig ist.
Nun zum Schmankerl:
Ist eigentlich nur eine Interessefrage.
Code:
HashSet<Object> set = new HashSet<Object>(); // irgendein Inhalt. Für die Frage irrelevant
... // set füllen
// nun einen Iterator holen und für jedes Objekt o im Iterator
set.remove(o); // knackpunkt