Path: csiph.com!news.mixmin.net!newsreader4.netcologne.de!news.netcologne.de!.POSTED.xdsl-78-35-222-157.netcologne.de!not-for-mail From: Patrick Roemer Newsgroups: de.comp.lang.java Subject: Re: JUnit Test von JButton: Action wird nicht erkannt Date: Wed, 20 Jul 2016 13:00:55 +0200 Organization: news.netcologne.de Distribution: world Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Wed, 20 Jul 2016 11:00:55 +0000 (UTC) Injection-Info: newsreader4.netcologne.de; posting-host="xdsl-78-35-222-157.netcologne.de:78.35.222.157"; logging-data="10202"; mail-complaints-to="abuse@netcologne.de" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.24) Gecko/20100411 Thunderbird/2.0.0.24 Mnenhy/0.7.6.0 In-Reply-To: Xref: csiph.com de.comp.lang.java:13026 Responding to Christian H. Kuhn: > Am 19.07.2016 um 18:59 schrieb Patrick Roemer: >> Responding to Christian H. Kuhn: >> In beiden Fällen entsteht *keine* happens-before-Beziehung zwischen >> irgendwas. > > JETZT bin ich verwirrt. > > Ich war der Ansicht, bei > > commandA(); > SwingUtilities.invokeAndWait(() -> {commandB}); > commandC(); > SwingUtilities.invokeAndWait(() -> {commandD}); > > könnte ich mich darauf verlassen, dass die Reihenfolge A-B-C-D > eingehalten wird, sofern A und C nur auf dem gerade laufenden > aufrufenden Thread arbeiten, während bei dem entsprechenden Aufruf mit > invokeLater() lediglich sicher ist, dass A vor C (auf dem Hauptthread) > und B vor D (auf dem Swing-EDT) ausgeführt wird? Gemäß wall-time ist dem auch so. Damit ist aber noch nicht garantiert, dass C die Auswirkungen von Aktionen in B auch sieht. Und *das* ist, worum es bei happens-before-Beziehungen geht. >> Und was ein #invokeAndWait() in einem >> #actionPerformed() suchen könnte, will ich glaube ich gar nicht so genau >> wissen... ;) > > Nix direktes. Warum das eher dämlich wäre, habe ich schon begriffen :-) > Es gibt aber Methoden, die könnten theoretisch vom EDT aus aufgerufen > werden, dann bräuchten sie kein invoke...(). Oder von irgendeinem > anderen Thread. Dann brauchen sie invoke. Den Swing-EDT kann man > feststellen. Klingt schon fishy. Wenn eine Methode aus unterschiedlichen Kontexten aufgerufen werden kann, sollte der Kontext sie schlicht nicht interessieren müssen. Das #invoke...() gehört dann in eine Schicht, die den Kontext kennt, z.B. eben ins Presentation Model. Und Aufrufe, die darüber laufen, sollten dann eben immer aus einem non-EDT-Thread kommen. > Die throw-Klausel hat man aber trotzdem, wenn man die > Exception des invoke nicht fangen mag. Warum sollte man das nicht mögen? Eine InvocationTargetException will man eigentlich nicht weiterpropagieren. Und eine InterruptedException sollte man auch möglichst lokal behandeln. > Das kann auch eine beliebig lange > Kette von Methodenaufrufen sein. Und wenn keine dieser Methoden etwas > Sinnvolles mit der Exception aus invokeAndWait() anfangen kann, landet > die irgendwan in actionPerformed(). Das sollte eigentlich nicht passieren. Abgesehen davon: Ich kann mich nicht erinnern, #invokeAndWait() je (außer eben in Tests) eingesetzt zu haben. (Allerdings habe ich auch nur kleinere Hobbyprojekte mit Swing gemacht.) Üblicherweise will man #invokeLater(). Aber auch da muss man sich natürlich über eventuelle Exceptions Gedanken machen. Viele Grüße, Patrick