Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Java 7 Grundkurs

Mehrere Dinge gleichzeitig tun

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Mit Thread können Sie parallele Programmfäden erzeugen und sehen im Beispielprojekt, wie sie gestartet werden und wie Sie festlegen, was diese tun sollen.
09:04

Transkript

Die Fähigkeit, mehrere Dinge gleichzeitig zu tun, ist in die Programmiersprache Java bereits eingebaut. Wie das funktioniert, zeige ich Ihnen jetzt. Dazu legen wir uns ein neues, leeres Projekt an, also "Pfeil", "New Project", "Kategorie Java", "Java Application". Ich drücke auf "next", und da gebe ich der Anwendung den Namen "threaddemo". So. Zu diesem Namen kommen wir gleich. Eine Main Clause lassen wir uns nicht generieren, sondern wir drücken gleich auf "finish". In der Welt der Objektorientierung wird Arbeitsteilung großgeschrieben. Ein Objekt für eine Zuständigkeit. Deshalb erstellen wir uns zuerst eine Klasse, in der wir beschreiben, was der parallel laufende Prozess eigentlich tun soll. Ich drücke also mit der rechten Maustaste auf mein Projekt, sage "new", "Java class", und da dieser Prozess primär arbeiten soll, nenne ich ihn einfach "Arbeiter". Als Paket nehmen wir wieder com.video2brain.java7.threads, ohne z, und das war es. Damit unsere Klasse später in einem separaten Prozess ihre Arbeit verrichten kann, muss ich ein spezielles Interface implementieren, und zwar das Interface "runnable". Schauen wir uns das Interface mal kurz in der Javadoc an, wir sehen das hier, Interface "runnable" im Paket "Java lang", ein Import ist also nicht nötig, und wenn wir da runter schauen, dann stellen wir fest, es gibt genau eine Methode, die in diesem Interface definiert ist, und die Methode heißt "run". Sie nimmt keine Parameter und gibt auch nichts zurück. Diese Methode muss unsere Klasse jetzt also anbieten. Das heißt natürlich auch NetBeans, deswegen bekomme ich hier schon eine rote Kringellinie und ein gelbes Lämpchen, auf das wir drauf klicken können, und jetzt steht hier "implement all abstract methods", das heißt also die fehlende Methode "run", und wir sparen uns wieder ein bisschen Tipparbeit. Sie können natürlich, wenn sie möchten, diese Methode auch einfach zu Fuß eintippen. Diese Zeile hier nehmen wir wieder raus. Wir wollen ja keine Exception haben. Und jetzt lassen wir unseren Arbeiter etwas unheimlich komplexes tun, nämlich von null bis neun zählen, und die Zahlen ausgeben. Also, eine V-Schleife int i = 0, e < 10, e++*, und in dieser Schleife geben wir einfach das i aus. Also s out, Tabulator-Taste, Anführungszeichen nehmen wir weg, stattdessen ein i. In dieser Klasse beschreiben wir also die Nutzlast, das was tatsächlich in dem parallelen Prozess später passieren soll. Jetzt müssen wir natürlich den parallelen Prozess auch noch erzeugen und starten. Dazu erstellen wir uns jetzt eine Hauptklasse, im selben Package, also rechte Maustaste auf das Package, "new Java class". Ich nenne diese Klasse "thread demo". Genau, alles richtig, "finish". Damit wir was zum ausführen haben kommt hier natürlich eine Main Methode rein, "psvm", "tab", und hier erzeugen wir uns zuerst einmal ein Exemplar unserer Arbeiterklasse. Der Arbeiter ist ein Zähler, "new", "Arbeiter", mit Steuerung Leertaste sparen Sie sich ein bisschen Tipparbeit. Und nun kommt der Teil, wo wir uns mit dem parallelen Prozess beschäftigen. Diese Funktionalität, einen parallelen Prozess zu initialisieren und zu starten, ist in einer separaten Klasse gekapselt. Die Klasse heißt, wie sie sich ja vielleicht schon gedacht haben, "Thread". Auch diese Klasse befindet sich im Paket "Java lang", auch hier ist also kein Import nötig. Wir erzeugen uns also ein neues Thread Objekt, und im Konstruktor übergeben wir jetzt den Arbeiter. An dieser Stelle ist jetzt das Java-Objekt Thread bereits erzeugt worden, der parallele Prozess läuft aber noch nicht. Um den zum Laufen zu bringen, muss ich jetzt von meinem Thread-Objekt eine Methode aufrufen, und die heißt "Start". In diesem Moment startet jetzt tatsächlich dieser Prozess. Damit wir den zeitlichen Verlauf besser einordnen können, gebe ich davor und danach eine Statusmeldung aus. Vorher "starte", und danach "fertig". Dann fahren wir die Geschichte mal ab, drücken hier auf das grüne Knöpfchen -- Ich muss natürlich vorher noch speichern, nochmal auf das grüne Knöpfchen. Jetzt hat er die Main Class gefunden, und wir sehen hier unten "starte", "fertig", und danach kommen die Zahlen von null bis neun. Das heißt, der zeitliche Ablauf sah so aus: In der Main Methode wurde "starte" ausgegeben, dann wurde dem Thread gesagt, "Starte bitte einen parallelen Prozess". Das hat er auch gemacht; das hat noch einen Moment gedauert, bis der Prozess wirklich loslegen konnte. In der Zwischenzeit hat die Main Methode bereits "fertig" ausgegeben, und dann war der andere Prozess soweit und hat angefangen, seine Zahlen der Reihe nach auszugeben. Obwohl wir also bereits hier am Ende der Main Methode angekommen waren, lief das Programm trotzdem noch weiter. Die Java VM wird nämlich erst beendet, wenn der letzte Thread fertig mit seiner Arbeit ist. Aber was ist schon ein parallel laufender Prozess? Fügen wir einfach noch einen weiteren hinzu. Dazu brauche ich einfach ein weiteres Thread Objekt, von dem ich dann auch "Start" aufrufen muss. Dazu kopiere ich mir diese Zeile hier, damit ich nicht alles nochmal tippen muss, mit Strg+Shift+↓ und ich ersetze den Variablennamen "erster" durch "zweiter". Hier hinter "erster.start" schreib ich jetzt "zweiter.start", und wir führen das Ganze erneut aus, auch diesmal ist die Main Methode wieder zuerst fertig gewesen und jetzt werfen die beiden Prozesse hier abwechselnd ihre Zahlen raus. Wir wissen aber leider nicht, welcher Prozess welche Zahl ausgegeben hat. Dafür gibt's aber ein nettes Feature in der Klasse Thread, ich kann Threads nämlich Namen geben. Das machen wir mal. Man sollte das gemacht haben, bevor man den Prozess startet, also am besten hier. Die Methode um den Namen zu setzen heißt "zName", und dann kann ich dem einen Namen geben. Ich nenne ihn einfach mal "erster", und den zweiten nenn ich dann natürlich "zweiter". "zName", "zweiter". So ganz ohne weiteres wird natürlich dieser Name nicht ausgegeben. Sie müssen das schon selbst machen. Die Ausgabe erfolgt hier in unserem Arbeiter. Der Arbeiter weiß aber überhaupt nichts von Threads. Er hat einfach nur seine Run-Methode und da drin steht, was passieren soll. Auch wenn der Thread also seinen Worker kennt, von dem er nämlich die Run-Methode aufruft, wenn er selbst gestartet wird, so kennt doch der Worker, der Arbeiter, seinen Thread nicht. Auch hier hilft uns wieder die Klasse Thread selbst, und zwar bietet sie uns eine statische Methode, mit der wir uns den aktuell laufenden Thread zurückgeben lassen können. Statische Methoden rufen wir mit Namen der Klasse auf, also "thread.", und die Methode heißt "current thread", und liefert ein Thread-Objekt zurück. Da gibt es jetzt analog zu "set name" natürlich auch "get name". Manchen wir das Ganze noch etwas hübsch, indem wir hier einen Doppelpunkt dazwischen setzen, ein Leerzeichen, so. Das heißt, es wird jetzt hier in der Schleife jedes Mal geguckt, welcher Prozess läuft denn gerade, wo befinden wir uns denn, von diesem Prozess wird dann der Name geholt, er wird ausgegeben, und hinten dann der Doppelpunkt und die Zahl. Ein weiteres Mal das ganze ausführen, und jetzt sehen wir hier Main-Methode, wieder als erster fertig, und jetzt geht's los. Der Erste gibt seine null aus, gibt seine eins aus, dann wird er unterbrochen und es kommt der Zweite, gibt seine null aus, es kommt der erste mit seiner zwei, und so geht das hin und her, beide Prozesse laufen also offensichtlich recht gut parallel, bis sie dann am Ende beide mit der neun fertig sind. Führe ich das Programm ein weiteres Mal aus, dann muss hier nicht zwangsläufig dasselbe Ergebnis stehen. Sie sehen, diesmal hat der erste sogar drei Zahlen geschafft, bevor der Zweite dazwischen kam. Sie sehen also, das einzige was sicher ist, ist, dass jeder der beiden Prozesse, für sich genommen, streng sequentiell arbeitet. Wann aber der eine unterbrochen wird und der andere rankommt, lässt sich nicht vorherbestimmen. Nun wissen Sie also, wie Sie parallele Programmfäden erzeugen können, indem Sie nämlich die Klasse Thread verwenden -, wie Sie festlegen können, was diese parallelen Prozesse tun, indem Sie Klassen das Interface "runnable" implementieren lassen, mit der Methode "run" -, und Sie haben auch gesehen, wie Sie dann diese parallelen Prozesse starten, indem Sie von dem Thread Objekt jeweils "start" aufrufen.

Java 7 Grundkurs

Machen Sie sich mit den Grundlagen der Java-Programmierung vertraut und lernen Sie die Syntax der Sprache sowie das Konzept der objektorientierten Softwareentwicklung kennen.

8 Std. 32 min (66 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!