ActionListener blockiert Bedienung des ganzen Systems

Apotekarnes

Mitglied
Hallo allerseits,

ich habe einen ActionListener für eine JComboBox.
Beim Auswählen eines der Items wird ruft der Listener ein externes Skript als Prozess auf und wartet mit p.waitFor() auf dessen Ende.
Während dieser Wartezeit freezed nicht nur die GUI sondern auch die Bedienbarkeit des gesamten Systems (Ubuntu). Tastatureingaben (Ausnahme: ALT-Taste) und Bedienung per Maus sind nicht mehr möglich. Währenddessen bleibt die JComboBox offen.
Erst nach 3 Minuten - so lange dauert die Ausführung des externen Skripts - geht alles wie gewohnt.

Leider werden die Ergebnisse des externen Skripts im ActionListener für den weiteren Ablauf benötigt, sodass ich das p.waitFor() brauche.

Wieso blockiert der JAVA-Prozess in dieser Situation das ganze System?

Was kann man tun um das Problem zu umgehen?

Viele Grüße
Apotekarnes
 
Wieso blockiert der JAVA-Prozess in dieser Situation das ganze System?
Das glaube ich nicht.

Wahrscheinlich/Sicher blockiert deine Applikation und je nach dem, wird auch das Gesamtsystem in Mitleidenschaft gezogen, wenn da beispielsweise blockierende I/O gemacht wird. Sollte also eher "schnarchlangsam" sein, aber noch reagieren.

Was kann man tun um das Problem zu umgehen?
Anders programmieren😉

Im Ernst, du musst den Code auf mehrere Threads verteilen und insbesondere NICHT den EDT blockieren, Siehe zum Einstieg meinen Blog zu SwingWorker.
 
Versuchs Mal mit Threads.
Starte den Aufruf deines Skritpes über einen thread, sollte nix blockieren, oder deine Maschiene ist ein 486dx2 aus dem Jahre 1992. :lol:
 
Vielen Dank euch beiden! 🙂

Mit Threads/StringWorkers hat es geklappt.

Dennoch wundere ich mich, dass es ein einzelnes JAVA Programm, ob darin nun ein ActionListener läuft oder was auch immer, es schafft, die Bedienbarkeit des Systems zu blockieren. ???:L
 
nun .. die frage dürfte wohl mal wieder in die richtung fallen : wie genau callst du das script und was macht es ?

wenn man den EDT blockiert sollte normalerweise nur deine gui "freezen" ... der rest des systems aber unabhängig davon normal weiterlaufen


wobei : es kommt auch drauf an welchen desktop-manager du nutzt und wie dieser mit events umgeht ... und auch welche VM du nutzt und wie die sich ins system einklinkt

wenn alles richtig schlimm kommt kann es schon durch aus sein das ein event ausgelöst wird, es jedoch nicht verarbeitet werden kann weil gerade das event was du ausgelöst hast um das ganze zu starten sich bis runter in den kernel zieht ... aber da gehe ich selbst bei älteren unix-varianten von aus das diese nicht so schlecht programmiert sind ...


und selbst wenn solltest du mit STRG+ALT+1 immer noch vom dwm aufs terminal kommen und kannst dort z.b. mit top gucken wer die leistung klaut
 
Ja, benutze OpenJDK und eines der neuesten Ubuntu Systeme

Aus einem mir nicht bekannten Grund scheint das OpenJDK dafür verantwortlich zu sein. Das Problem findest du im Ubuntu Forum häufiger und ich hatte es ebenfalls (auch unter nicht Ubuntu). Eine Alternative wäre es mit Oracles Software zu arbeiten, oder dir, falls das Problem in Zukunft auftritt, entsprechende Threads rauszusuchen.
Gab immer wieder mal kleine Lösungen für spezielle Situationen, aber befriedigendes hab ich leider noch nicht gefunden. 🙁
 
Swing ist eine Fehlkonstruktion.
Willst du einfach so etwas an der GUI ändern sollte man das im EDT machen. In dem befindet man sich aber in den meisten Fällen an dieser Stelle nicht.
Wird ein ActionListener aufgerufen will man meist irgendwelche business logik ausführen. Das darf man aber nicht im EDT machen in dem man sich in diesem Moment aber befindet.

Ds hätte grundsätzlich anders gelöst werden können. Wichtig ist halt das man weiß was der EDT ist und das man sich bewusst ist, ob man da gerade drin ist und ob der Code den man gerade macht im EDT laufen darf...
 

Zurück
Oben