Hi Leute,
ich bin grade dabei mir ein kleines eigenes TreeModel für Ordnerstrukturen / Dateien zu basteln. Der Grund ist: Zumindest bei mir gibt es ein paar Ordner, bei denen File#listFiles() schon mal ein paar Sekunden dauern kann - zum Beispiel "Netzwerk" oder das (sowieso leere, aber trotzdem noch angeschlossene) Diskettenlaufwerk A.
Mein Plan war jetzt, dass das Model in einem eigenen Thread schonmal die Unterverzeichnisse vorlädt, die möglicherweise bald abgefragt werden. Und das hat jetzt sehr seltsame Effekte: das Ganze funktioniert nur sehr selten mal zufällig (d.h. normalerweise braucht es einige Zeit bis die Unterordner dargestellt werden). Und das obwohl ich mittlerweile mitprotokolliere und sämtliche Methoden meines Models üblicherweise nach (laut System.nanoTime) einem Millisekundenbruchteil zurückkehren.
Was ich aber sehe ist: ich öffne den Zweig "Computer". Da die Inhalte bereits geladen sind, sagt mein Model dem JTree sofort was alles drin ist. Gleichzeitig fängt mein Model an, die Unterordner nachzuladen - beginnend mit den Unterordnern von A:\. Und aus mysteriösen Gründen scheint das den JTree zu blockieren: erst nach ca. 1 Sekunde hab ich, dass A:\ leer ist. Dann werden plötzlich noch ein paar Methoden im Model aufgerufen und das Ergebnis wird angezeigt.
Hat irgendjemand sowas schonmal erlebt? Klingt ja wohl nach irgendwelchen Synchronisierungsproblemen
Ich hab bisher nur rausfinden können, dass mein loader-Thread während dieser Sekunde via LockSupport.park -> sun.misc.Unsafe.park wohl auf irgendetwas wartet... Das heißt wohl doch nicht ohne Grund Unsafe.
----------------------------------------------
Auszug aus dem Log
Schwarz: Logging-Ausgaben aus dem TreeModel
Rot: Ausgaben des Extra-Threads
Grau: Kommentare von mir
----------------------------------------------
Code
Edit: siehe hier
ich bin grade dabei mir ein kleines eigenes TreeModel für Ordnerstrukturen / Dateien zu basteln. Der Grund ist: Zumindest bei mir gibt es ein paar Ordner, bei denen File#listFiles() schon mal ein paar Sekunden dauern kann - zum Beispiel "Netzwerk" oder das (sowieso leere, aber trotzdem noch angeschlossene) Diskettenlaufwerk A.
Mein Plan war jetzt, dass das Model in einem eigenen Thread schonmal die Unterverzeichnisse vorlädt, die möglicherweise bald abgefragt werden. Und das hat jetzt sehr seltsame Effekte: das Ganze funktioniert nur sehr selten mal zufällig (d.h. normalerweise braucht es einige Zeit bis die Unterordner dargestellt werden). Und das obwohl ich mittlerweile mitprotokolliere und sämtliche Methoden meines Models üblicherweise nach (laut System.nanoTime) einem Millisekundenbruchteil zurückkehren.
Was ich aber sehe ist: ich öffne den Zweig "Computer". Da die Inhalte bereits geladen sind, sagt mein Model dem JTree sofort was alles drin ist. Gleichzeitig fängt mein Model an, die Unterordner nachzuladen - beginnend mit den Unterordnern von A:\. Und aus mysteriösen Gründen scheint das den JTree zu blockieren: erst nach ca. 1 Sekunde hab ich, dass A:\ leer ist. Dann werden plötzlich noch ein paar Methoden im Model aufgerufen und das Ergebnis wird angezeigt.
Hat irgendjemand sowas schonmal erlebt? Klingt ja wohl nach irgendwelchen Synchronisierungsproblemen
----------------------------------------------
Auszug aus dem Log
Schwarz: Logging-Ausgaben aus dem TreeModel
Rot: Ausgaben des Extra-Threads
Grau: Kommentare von mir
At 12396130: Start Loading: C:\Users\Illuvatar\Desktop
0ms (start time: 12396171) for addTreeModelListener. Params: [javax.swing.JTree$TreeModelHandler@50c4fe76]
0ms (start time: 12396171) for getRoot. Params: []
0ms (start time: 12396171) for getRoot. Params: []
178ms (start time: 12396171) for isLeaf. Params: [C:\Users\Illuvatar\Desktop]
0ms (start time: 12396350) for getRoot. Params: []
0ms (start time: 12396350) for addTreeModelListener. Params: [javax.swing.plaf.basic.BasicTreeUI$Handler@72e6f7d2]
0ms (start time: 12396350) for getRoot. Params: []
0ms (start time: 12396351) for isLeaf. Params: [C:\Users\Illuvatar\Desktop]
0ms (start time: 12396371) for isLeaf. Params: [C:\Users\Illuvatar\Desktop]
0ms (start time: 12396372) for isLeaf. Params: [C:\Users\Illuvatar\Desktop]
0ms (start time: 12396372) for getChildCount. Params: [C:\Users\Illuvatar\Desktop]
At 12396372: Start Loading: Computer
[...] Hier werden noch einige Sachen zum Zeug aufm Desktop gefragt und alle Ordner auf dem Desktop werden vorgeladen. Unter anderem übrigens irgendwann, das braucht grade extrem lang:
At 12396598: Start Loading: Network
After 30136ms: Done Loading: Network
[...]
Hier wirds wirklich interessant: Jetzt klick ich
0ms (start time: 12429873) for isLeaf. Params: [Computer]
0ms (start time: 12429873) for isLeaf. Params: [Computer]
0ms (start time: 12429874) for isLeaf. Params: [Computer]
0ms (start time: 12429874) for isLeaf. Params: [Computer]
0ms (start time: 12429874) for isLeaf. Params: [Computer]
0ms (start time: 12429874) for getChildCount. Params: [Computer]
0ms (start time: 12429874) for getChild. Params: [Computer, 0]
0ms (start time: 12429874) for isLeaf. Params: [A:\]
At 12429874: Start Loading: A:\
0ms (start time: 12429875) for getChild. Params: [Computer, 1]
0ms (start time: 12429875) for isLeaf. Params: [C:\]
[...]
0ms (start time: 12429878) for getChild. Params: [Computer, 6]
0ms (start time: 12429878) for isLeaf. Params: [H:\]
Pause...
After 1105ms: Done Loading: A:\
At 12430979: Start Loading: C:\
Und jetzt erst fängt der JTree wieder an:
0ms (start time: 12430979) for isLeaf. Params: [C:\]
0ms (start time: 12430980) for isLeaf. Params: [D:\]
[...]
0ms (start time: 12430989) for isLeaf. Params: [C:\Users\Illuvatar\Desktop\LGVR0005.avi]
Und erst HIER wird das Fenster aktualisiert und die UI wird wieder bedienbar!
At 12430994: Start Loading: D:\
[...]
At 12431070: Start Loading: H:\
----------------------------------------------
Code
Edit: siehe hier
Zuletzt bearbeitet: