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/20 07:25] – [Beispiel 1: Überschreiben der run()-Methode] 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 57: Zeile 61:
  
  
-==== Beispiel 2: Eigene Klassedie Runnable implementiert ====+===== 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> <HTML>
  
-<div class="java-online" style="height: 400px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Threads2'}">+<div class="java-online" style="height: 400px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Threads1a'}">
  
 <script type="text/plain" title="Hauptprogramm.java"> <script type="text/plain" title="Hauptprogramm.java">
 SystemTools.setSpeed(8); SystemTools.setSpeed(8);
 +ArrayList<Thread> threads = new ArrayList<>();
 +
 for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
-   new MyThread("Thread " + i).start();+   Thread t = new MyThread("Thread " + i)
 +   threads.add(t); 
 +   t.start();
 } }
  
-while (true);+for(Thread t: threads){ 
 +   t.join(); 
 +
 + 
 +println("Alle fertig!", Color.lightgreen);
  
 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 87: Zeile 106:
 </div> </div>
 </HTML> </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.1734679520.txt.gz · Zuletzt geändert: 2024/12/20 07:25 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki