2011-12-04

Ultimate Swing, Teil 4

Haben Sie sich die Mühe gemacht, im Web mal nach “EDT” oder “Event Dispatching Thread” zu suchen?

Die (quasi-)parallele, Abarbeitung von Aufgaben ist seit vielen Jahrzehnten ein großer Wunsch von Anwendern wie Entwicklern. Je nachdem, auf welcher Ebene eine solche Parallelität stattfindet, spricht man von Multitasking oder Multithreading. Multitasking meint – stark vereinfacht ausgedrückt – das gleichzeitige Arbeiten mit mehreren Programmen. Das mag sich nach nichts Besonderem anhören. Dem Benutzer eines frühen Homecomputers würde so etwas aber in grenzenloses Staunen versetzen. Denn wenn er sein BASIC-Programm mit run gestartet hatte (sorry, aber kurz vor Weihnachten werde ich immer ein klein wenig sentimental), war der Rechner damit – und ausschließlich damit – beschäftigt. Auf den “Wir machen Spitzentechnologie preiswert”-Rechnern (kennt jemand diese Werbung noch?) gab es neben dem Hauptprogramm so genannte Accessories (nein, kein Mac). GEM (ein Teil von Ataris TOS) bot nämlich kooperatives Multitasking. Damit das funktionierte, mussten alle Beteiligten von sich aus die Kontrolle wieder an das System abgeben. Der Amiga bot übrigens “echtes”, also präemptives Multitasking.

Multithreading sorgt auf der Ebene von Programmen für Parallelität. Eine Anwendung kann also Daten von einem Webserver herunterladen und (quasi) gleichzeitig andere Dinge tun. Zum Beispiel Benutzereingaben entgegen nehmen, Dateien lesen oder schreiben, oder vielleicht einen weiteren Webservice kontaktieren. In Java ist der Schlüssel hierfür der Thread. Der richtige Umgang mit Threads ist nicht immer einfach zu verstehen – offen gesagt hat die Materie zahlreiche Bände gefüllt. Deshalb kann ich Sie nur ermutigen, bei Bedarf entsprechende Fachliteratur zu lesen.

Der Event Dispatching Thread ist ein Hintergrundthread, der im Zusammenhang mit der Verarbeitung von Ereignissen benötigt wird, die von Komponenten des Abstract Window Toolkits sowie Swing verschickt und empfangen werden. Hierbei handelt es sich unter anderem um Mausklicks, Mausbewegungen, Tastendrücke sowie um höherwertige Ereignisse. Das “simple” Anklicken einer Schaltfläche führt zu zahlreichen Ereignissen, die zwischen beteiligten Komponenten hin und her geschickt werden. Was passiert nun, wenn dieser Code auf unterschiedlichen Threads ausgeführt wird? AWT und das darauf aufsetzende Swing sind nicht Multithreading-fähig. Zustandsänderungen dürfen deshalb nur auf einem bestimmten Thread durchgeführt werden. Er wird EDT (Event Dispatching Thread) genannt. Einen wunderbaren Einblick in die Theorie gibt Graham Hamiltons Post Multithreaded toolkits: A failed dream?.

Was aber bedeutet das? Es liegt doch nahe, dem offenbar entstehenden Ärger aus dem Weg zu gehen, indem man einfach nur einen – DEN – Thread nimmt. Oder?

2 comments:

  1. Schöner Teil. Kurze Rückblicke in die Homecomputer-Steinzeit mag ich auch immer sehr. Bin auf die Fortsetzung gespannt.

    ReplyDelete
  2. Vielen Dank, ich freu mich, dass der Post gut angekommen ist. Das nächste Mal sehen wir uns an, was passiert, wenn man auf dem EDT bleibt. Dann gehts mit der Struktur der Anwendung weiter. Und ein Blick auf die Google APIs wird auch bald kommen. :-)

    ReplyDelete