Asynchrone Programmierung #1 (Multitasking / Multithreading)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Registriere dich um viele Vorteile zu genießen! Weniger Werbung, bessere Kommunikation und vieles mehr!

  • Der erste Post zu "Asynchrone Programmierung". In diesem Post erkläre ich die Begriffe Multitasking und Multithreading. Des Weiteren werfen wir einen Blick auf die Klasse java.lang.Thread und deren Verwendungsmöglichkeiten.
    Liebe dev-tek Community,

    in diesem Post werde ich die Begriffe Multitasking und Multithreading bezogen auf die Programmierung in Java anreißen. Danach werde ich genauer auf die Klasse java.lang.Thread eingehen und die erlernten Kenntnisse dann direkt an einem Beispiel anwenden.

    __________________________________________________________________________________________________________________________________________________________________________________________________________________________

    Inhalt:
    • Begriffserklärung: Multitasking und Multithreading
    • Wann eignet sich Multithreading?
    • Java.lang.Thread
    • Beispiel
    __________________________________________________________________________________________________________________________________________________________________________________________________________________________

    Multitasking:
    Was ist Multitasking? Multitasking ist das gleichzeitige Abarbeiten mehrerer Anwendungen. Zum Beispiel kann der Entwickler während ein, von ihm geöffnetes, Programm Dateien kopiert zum selben Zeitpunkt ein YouTube-Video im Browser anschauen. Doch dies ist eigentlich nur eine Illusion, denn genau genommen stellt der Prozessor seine Rechenzeit in rasantem Wechsel immer wieder dem einen oder dem anderen Programm zur Verfügung. Das Abarbeiten von Anweisungen eines Programms wird als Prozess oder Task bezeichnet und vom Betriebssystem gesteuert. Dieses reserviert auch einen eigenen Speicherbereich für jeden Prozess.

    Multithreading:
    Ein Prozess wird wiederum in sogenannte Threads untergliedert. Für die Verwaltung der Threads ist nicht das Betriebssystem, sondern die Anwendung selbst zuständig. Jede Anwendung besteht immer aus mindestens einem Thread, der automatisch durch die main-Methode gestartet wird. Threads verfügen über keine eigenen Speicherbereiche.

    __________________________________________________________________________________________________________________________________________________________________________________________________________________________

    Wann eignet sich Multithreading?
    Multithreading eignet sich sehr gut für Abläufe, die sich in einem bestimmten Rhythmus immer wiederholen und automatisch ablaufen, in die der Entwickler aber jederzeit eingreifen kann um den Ablauf zu unterbrechen, oder den Rhythmus zu verändern.

    __________________________________________________________________________________________________________________________________________________________________________________________________________________________

    Java.lang.Thread
    Mittels der Klasse java.lang.Thread ist es dem Entwickler möglich, mehrere (eigene) Threads zu erzeugen, zu stoppen, oder zu beenden.

    Einige Konstruktoren zum Erzeugen eines Threads:
    Spoiler anzeigen

    KonstruktorBeschreibung
    public Thread()Erzeugt einen Thread ohne externe Zielangabe für eine run-Methode
    public Thread(Runnable target)Erzeugt einen Thread, der die run-Methode target ausführen soll.
    public Thread(ThreadGroup Group, Runnable target, Stringn name)Erzeugt einen Thread, der zur Gruppe ThreadGroup gehört. Er führt die run-Methode von target aus und heißt name.

    Abbildung 1.0


    Die wichtigsten Methoden, der Klasse Java.lang.Thread im Überblick:
    Spoiler anzeigen

    MethodeBeschreibung
    String getName()Liefert den Name des Threads.
    static setName(String name)Setzt den Namen des Threads auf name.
    static Thread currentThread()Liefert eine Referenz auf dem laufenden Thread.
    boolean isInterrupted()Liefert zurück, ob der Thread unterbrochen ist
    void getPriority()Liefert die Priorität eines Threads.
    void setPriority(int p)Setzt die Priorität des Thread auf den Wert p.
    void join()Wartet, bis der Thread, dessen join-Methode aufgerufen wird, beendet ist.
    void run()Ruft die run-Methode des im Konstruktor angegebenen externen Runnable-Objekts auf. Wurde keines übergeben, führt sie nichts aus.
    void start()Startet den Thread
    void yield()Erzwingt eine Pause, damit andere Threads Gelegenheit zum Ausführen erhalten.
    void sleep(long m)Erzwingt eine Pause von m Millisekunden in der Ausführung des Threads.

    Abbildung 1.1


    Ein Thread wird durch die Methode mit dem Namen run() und die Implementierung von Runnable lauffähig. Es gibt zwei verschiedene Möglichkeiten für die Erstellung eines Threads:
    • Sie leiten eine eigene Klasse von der Klasse Thread ab
    • Sie implementieren das Interface Runnable


    Methode 1:
    Klasse:
    Spoiler anzeigen
    EigeneKlasse extends Thread

    run()
    .
    .
    .
    Anwendung:
    Spoiler anzeigen
    EigeneKlasse eK = new EigeneKlasse()

    ek.start()
    .
    .
    .

    Abbildung 1.2

    Methode 2:
    Klasse:
    Spoiler anzeigen
    EigeneKlasse extends AndereKlasse implements Runnable

    run()
    .
    .
    .
    Anwendung:
    Spoiler anzeigen
    Thread t = new Thread(this, ...)

    t.start()

    Abbildung 1.3

    Ein Thread läuft immer so lange, bis die zugehörige run-Methode endet.

    __________________________________________________________________________________________________________________________________________________________________________________________________________________________

    Beispiel:

    In diesem Beispiel verwende ich Methode 1 um einen simplen Countdown mittels Multithreading zu erstellen.

    Java-Quellcode

    1. public class ExampleClass extends Thread{
    2. /**
    3. * Die run-Methode des Interfaces 'Runnable'
    4. */
    5. @Override
    6. public void run(){
    7. // Startwert des Countdowns
    8. int time = 60;
    9. /**
    10. * Solange die run Methode läuft, läuft auch die while-Schleife
    11. */
    12. while(true){
    13. /**
    14. * Wenn die aktuelle Zeit duch 10 teilbar ist, wird sie ausgegeben
    15. */
    16. if(time%10 == 0){
    17. System.out.println("Noch " + time + " Sekunden bis zum Start!");
    18. }
    19. // Aktuelle Zeit wird minus 1 gerechnet
    20. time--;
    21. /**
    22. * Wenn die aktuelle Zeit 0 beträgt wird eine Nachricht ausgegeben und der Thread gestoppt
    23. */
    24. if(time == 0){
    25. System.out.println("Das Spiel startet jetzt!");
    26. this.stop();
    27. }
    28. }
    29. }
    30. }
    Alles anzeigen

    __________________________________________________________________________________________________________________________________________________________________________________________________________________________

    Ich hoffe, dass ich mit diesem ersten Part der Tutorialreihe ein paar Leuten weiterhelfen konnte.
    Für Fragen, oder Verbesserungen bin ich offen :)

    Mit freundlichen Grüßen
    SevoX :P

    __________________________________________________________________________________________________________________________________________________________________________________________________________________________

    Alle in diesem Thread vorkommenden Abbildungen(Abbildung 1.0, Abbildung 1.1, Abbildung 1.2, Abbildung 1.3) habe ich dem Buch "Programmieren lernen mit Java" von Hans-Peter Habelitz entnommen.

    241 mal gelesen

Kommentare 5

  • NathanNr -

    Wird die while Schleife jede Sekunde einmal ausgeführt?

    • SevoX -

      Hey Nathan,
      in dieser while-Schleife besteht kein Unterschied zur normalen while-Schleife.
      Es ist eine abweisende Schleife, die checkt, ob die Bedingung zutrifft und dann den Code in ihrem Inneren ausführt. Und das am laufenden Bande, also nicht in bestimmten Zeitintervallen.

      Ich glaube du bist auf diese Frage gekommen, weil du schon Erfahrungen mit Runnable im normalen Gebrauch gemacht hast. Dort wird die run-Methode in bestimmten Zeit-Intervallen ausgeführt. Doch bei dieser Art der run-Methode läuft sie nur solange, bis der in ihr enthaltene Code ausgeführt worden ist.

      Ich hoffe ich konnte helfen, wenn nicht frag ruhig nochmal.

      Mit freundlichen Grüßen
      SevoX

    • NathanNr -

      Hey,
      ich bin auf diese Frage gekommen, weil mir in der While Schleife oder der Run Methode nicht ersichtlich geworden ist, dass diese genau 1/Sek ausgeführt wird und time eins runterzählt.

      MfG Nathan

  • Janhektor -

    Gute Übersicht!

    Trotzdem ist es bis zu diesem Punkt relativ trivial und im Zweifel mit einer kurzen Recherche zu lernen.
    Du könntest etwas in die Tiefe gehen und z.B. zu folgenden Punkten schreiben:
    - Wie wirken sich Mehrkernprozessoren auf die Verarbeitung von Threads ab?
    - Schlüsselwörter "synchronized" und "volatile" mit Beispielen
    - Callbacks
    Hängt natürlich davon ab, wie viel Zeit du in diesen Eintrag investieren möchtest. Aber der Qualität würde es nicht schaden.

    • SevoX -

      Danke für den Vorschlag :) ! Ich werde das in den nächsten Tagen ergänzen.