10.01 Parallele Abläufe mit Threads
Ein Thread kann in das Deutsche am Ehesten mit Strang oder Faden übersetzt werden. Denn ein Thread stellt genau einen Strang/Faden von Programmoperationen dar, die nacheinander (also sequentiell) abgearbeitet werden. Ihr Java Programm läuft standardmäßig in einem einzelnen Thread ab. Jedoch können durch Multithreading einzelne Funktionen parallel, also gleichzeitig ausgeführt werden.
Technischer Hintergrund
Verfügt Ihr Computer tatsächlich über mehrere Prozessoren, werden die in separaten Threads ausgelagerten Programmteile auch wirklich parallel ausgeführt. Ansonsten muss ein wenig getrickst werden. Moderne Betriebssysteme führen die Threads nicht gleichzeitig aus, sondern geben jedem Thread ein paar Millisekunden Zeit, seine Arbeit zu verrichten, bevor der Nächste an die Reihe kommt. So wird Multithreading (auch als Multitasking bekannt) simuliert.
Sollten Sie ein altes Betriebssystem einsetzen, welches kein Multitasking beherrscht, kümmert sich die Java Virtual Machine um die Ressourcenverteilung auf die unterschiedlichen Threads. Sie können also ohne Rücksicht auf das Zielsystem (wie es dank Javas Plattformunabhängigkeit meistens möglich ist) mit Threads arbeiten.
Vor- und Nachteile durch Multithreading
Bei Rechnern mit mehreren Prozessoren liegt der Vorteil auf der Hand: Programmteile werden parallel zueinander ausgeführt und laufen somit schneller ab. Wie sieht es aber bei einzelnen Prozessoren aus? Hier ist es nicht ganz so einfach einen Performancegewinn zu erzielen. Mit intelligenter Planung ist jedoch auch hier ein deutlicher Leistungsschub möglich. Angenommen Sie möchten eine große Datei von der Festplatte einlesen, eine Anfrage an einen Server schicken und einen rechenintensiven Algorithmus durchlaufen lassen. Ohne Threads lesen Sie zuerst von der Festplatte ein und warten dabei einen Großteil der Zeit auf die Festplatte, während der Prozessor vor sich hin schläft. Anschließend Fragen Sie den Server – auch hier warten Sie bis die Anfrage beim Server angekommen ist, und die Antwort über das Netz an Sie zurück geschickt wurde. Jetzt erst kommt der große Auftritt für den Prozessor. Er berechnet einen sehr zeitintensiven Algorithmus. Aber geht das nicht auch effektiver? Natürlich! Sie könnten diese drei Hauptaufgaben in jeweils einen separaten Thread auslagern. Während der Prozessor auf die Festplatte und eine Antwort vom Server wartet, kann er sich ruhig schon einmal dem Algorithmus widmen.
Ansonsten werden Sie auch sehr wahrscheinlich bei der GUI-Programmierung mit Threads arbeiten. Damit Ihre GUI nicht einfriert und somit bedienbar/aktualisierbar bleibt, müssen rechenintensive Aktionen in einen extra Thread ausgelagert werden.
Der Nachteil wird jedoch ebenso schnell deutlich. Durch die Tatsache, dass Ihre Anwendung nun nicht mehr sequentiell ausgeführt wird, somit einzelne Programmabschnitte unabhängig voneinander abgearbeitet werden, und unterschiedliche Threads eher nicht gleichzeitig fertig werden bzw. auch nicht bei jedem Durchlauf die selbe Zeit beanspruchen (abhängig von Randbedingungen wie Zielrechner und momentane Auslastung), ist ein hoher Grad an Koordination der einzelnen Threads notwendig. Dies bedeutet, dass Sie beim Design mehr „Was wäre Wenn?“-Fälle abfangen müssen. Dadurch entsteht mehr Code und die Anwendung wird an dieser Stelle auch fehleranfälliger. Mit ein bisschen Übung und Weitblick sollte Sie dieses Szenario aber nicht vor unlösbare Probleme stellen.