Benutzer-Werkzeuge

Webseiten-Werkzeuge


parallelism:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
parallelism:start [2024/12/17 17:19] – [Threads in Java] Martin Pabstparallelism:start [2025/03/09 07:53] (aktuell) – [Beispiel 1: Überschreiben der run()-Methode] Martin Pabst
Zeile 4: Zeile 4:
   * Von modernen Betriebssystemen wird erwartet, dass sie es ermöglichen, sehr viele Prozesse (meist mehr als Prozessorkerne verfügbar sind) gleichzeitig ablaufen zu lassen.   * Von modernen Betriebssystemen wird erwartet, dass sie es ermöglichen, sehr viele Prozesse (meist mehr als Prozessorkerne verfügbar sind) gleichzeitig ablaufen zu lassen.
  
-Welche Herausforderungen dies in der Softwartechnik zur Folge hat und wie die auftretenden Probleme gelöst werden können, erfahren Sie in diesem Kapitel.+Welche Herausforderungen dies in der Softwartechnik zur Folge hat und wie die auftretenden Probleme gelöst werden können, erfahren Sie in diesem Kapitel. \\ \\  
 +**Unterkapitel:** 
 +  * [[parallelism:monitor:start|Wechselseitiger Ausschluss]] 
 +  * [[parallelism:producerconsumer:start|Erzeuger-Verbraucher-Probleme]] 
 +  * [[parallelism:deadlocks:start|Deadlocks (Verklemmungen)]]
 </WRAP> </WRAP>
  
Zeile 24: Zeile 28:
  
  
- +==== Beispiel 1: Überschreiben der run()-Methode ==== 
 +{{ :parallelism:thread-class-diagram.svg |}}
  
 <HTML> <HTML>
Zeile 40: Zeile 44:
  
 class MyThread extends Thread { class MyThread extends Thread {
-   int i = 0; 
  
    public void run() {    public void run() {
 +      int i = 0;
       while (i < 10) {       while (i < 10) {
          i++;          i++;
Zeile 55: Zeile 59:
 </div> </div>
 </HTML> </HTML>
 +
 +
 +===== Die Methode join =====
 +<WRAP center round info 60%>
 +Ruft man während der Abarbeitung eines Threads (im folgenden: "Thread 1") die Methode ''join'' eines **anderen** Threads (im folgenden: "Thread 2") auf, so wartet Thread 1 so lange, bis Thread 2 beendet ist. Erst dann fährt Thread 1 mit der nächsten Anweisung fort. \\ \\
 +**Wichtiges Detail:** \\  
 +Das "Warten" von Thread 1 geschieht nicht **aktiv**, indem in einer Wiederholung immer wieder überprüft wird, ob Thread 2 schon beendet ist, sondern **passiv**, d.h. der für Thread 1 reservierte Prozessorkern steht in dieser Zeit für andere Threads zur Verfügung: 
 +</WRAP>
 +
 +==== Beispiel 2: Nutzung von Thread.join ====
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 400px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Threads1a'}">
 +
 +<script type="text/plain" title="Hauptprogramm.java">
 +SystemTools.setSpeed(8);
 +ArrayList<Thread> threads = new ArrayList<>();
 +
 +for (int i = 0; i < 10; i++) {
 +   Thread t = new MyThread("Thread " + i);
 +   threads.add(t);
 +   t.start();
 +}
 +
 +for(Thread t: threads){
 +   t.join();
 +}
 +
 +println("Alle fertig!", Color.lightgreen);
 +
 +class MyThread extends Thread {
 +
 +   public void run() {
 +      int i = 0;
 +      while (i < 10) {
 +         i++;
 +         
 +         println(this.getName() + " counts:  " + i );
 +         
 +      }
 +   }
 +}
 +</script>
 +
 +</div>
 +</HTML>
 +==== Beispiel 2: Eigene Klasse, die Runnable implementiert ====
 +{{ :parallelism:thread-class-diagram_myrunnable.svg |}}
 +<HTML>
 +
 +<div class="java-online" style="height: 600px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Threads2'}">
 +
 +<script type="text/plain" title="Hauptprogramm.java">
 +SystemTools.setSpeed(8);
 +for (int i = 0; i < 10; i++) {
 +   Thread t = new Thread(new MyRunnable("Thread " + i));
 +   t.start();
 +}
 +
 +while (true);
 +
 +class MyRunnable implements Runnable {
 +   
 +   String name;
 +
 +   MyRunnable(String name) {
 +      this.name = name;
 +   }
 +
 +   public void run() {
 +      int i = 0;
 +      while (i < 10) {
 +         i++;
 +         println(this.name + " counts:  " + i);
 +      }
 +   }
 +}
 +</script>
 +
 +</div>
 +</HTML>
 +
 +
 +==== Für Interessierte: Implementierung eines Interfaces durch eine Lambda-Function ====
 +<WRAP center round info 80%>
 +Besitzt ein Interface nur eine einzige Methode, so nennt man es **functional interface**. Das Interface ''Runnable'' ist ein Beispiel dafür. \\ 
 +An jeder Stelle, an der ein Objekt einer Klasse erwartet wird, die ein functional interface implementiert, kann stattdessen eine Kurzform verwendet werden, die man **lambda function** nennt. Sie sieht so aus:
 +<code java>
 +(parameter 1, ..., parameter n) -> { Anweisungen }
 +</code>
 +Lambda functions sind ein Ersatz für die in vielen anderen Programmiersprachen verfügbaren **closures**, unterscheiden sich aber in einem wesentlichen Punkt von diesen: Wird eine **außerhalb** der lambda function/closure deklarierte Variable **innerhalb** der lambda function/closure genutzt, so wird  
 +  * im Falle der lambda function ihr Wert zum Zeitpunkt des Starts der Funktion übergeben während 
 +  * im Falle der closure eine Referenz übergeben wird.
 +Bei letzteren kann daher von verschiedenen closures und von außerhalb auf **die identische Variable** zugegriffen werden, während bei ersteren jede lambda function ihre eigene Kopie der Variable erhält und nur auf diese zugreifen kann.
 +</WRAP>
 +
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 400px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Threads3'}">
 +
 +<script type="text/plain" title="Hauptprogramm.java">
 +SystemTools.setSpeed(8);
 +for (int i = 0; i < 10; i++) {
 +   String name = "Thread " + i;
 +   Thread t = new Thread(() -> {
 +         for (int j = 0; j < 10; j++) {
 +            println(name + " counts: " + j);
 +         }
 +      });
 +   t.start();
 +}
 +
 +while (true);
 +
 +</script>
 +
 +</div>
 +</HTML>
 +
 +
 +
parallelism/start.1734455973.txt.gz · Zuletzt geändert: 2024/12/17 17:19 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki