parallelism:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
parallelism:start [2024/12/20 07:21] – [Threads in Java] Martin Pabst | parallelism:start [2025/05/02 08:05] (aktuell) – [Aufgabe 1: Arbeitsteiliges Abarbeiten einer Aufgabe durch mehrere Threads] Martin Pabst | ||
---|---|---|---|
Zeile 4: | Zeile 4: | ||
* Von modernen Betriebssystemen wird erwartet, dass sie es ermöglichen, | * Von modernen Betriebssystemen wird erwartet, dass sie es ermöglichen, | ||
- | 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: | ||
+ | * [[parallelism: | ||
+ | * [[parallelism: | ||
</ | </ | ||
Zeile 40: | Zeile 44: | ||
class MyThread extends Thread { | class MyThread extends Thread { | ||
- | int i = 0; | ||
| | ||
+ | int i = 0; | ||
while (i < 10) { | while (i < 10) { | ||
i++; | i++; | ||
Zeile 55: | Zeile 59: | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | |||
+ | ==== Beispiel 2: Eigene Klasse, die Runnable implementiert ==== | ||
+ | {{ : | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | SystemTools.setSpeed(8); | ||
+ | for (int i = 0; i < 10; i++) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | while (true); | ||
+ | |||
+ | class MyRunnable implements Runnable { | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | this.name = name; | ||
+ | } | ||
+ | |||
+ | | ||
+ | int i = 0; | ||
+ | while (i < 10) { | ||
+ | i++; | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Die Methode join ===== | ||
+ | <WRAP center round info 60%> | ||
+ | Ruft man während der Abarbeitung eines Threads (im folgenden: " | ||
+ | **Wichtiges Detail:** \\ | ||
+ | Das " | ||
+ | </ | ||
+ | |||
+ | ==== Beispiel 3: Nutzung von Thread.join ==== | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | SystemTools.setSpeed(8); | ||
+ | ArrayList< | ||
+ | |||
+ | for (int i = 0; i < 10; i++) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | for(Thread t: threads){ | ||
+ | | ||
+ | } | ||
+ | |||
+ | println(" | ||
+ | |||
+ | class MyThread extends Thread { | ||
+ | |||
+ | | ||
+ | int i = 0; | ||
+ | while (i < 10) { | ||
+ | i++; | ||
+ | |||
+ | | ||
+ | |||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ==== Aufgabe 1: Arbeitsteiliges Abarbeiten einer Aufgabe durch mehrere Threads ==== | ||
+ | <WRAP center round todo 80%> | ||
+ | Im folgenden Programm wird die Summe aller Elemente eines Arrays ermittelt und ausgegeben. Die Abarbeitung dieser Aufgabe erfolgt in einem einzigen Thread. \\ \\ | ||
+ | Schreiben Sie das Programm so um, dass 10 nebenläufige Threads je 1/10 der Werte addieren und nach Abarbeitung aller 10 Threads die Teilsummen zu einer Gesamtsumme zusammengefasst werden. | ||
+ | </ | ||
+ | <WRAP center round tip 80%> | ||
+ | **Wichtige Info zu dieser Aufgabe:** \\ | ||
+ | Javascript-Programme im Browser unterliegen der Einschränkung, | ||
+ | Startet man in einer " | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | int[] werte = new int[1000]; | ||
+ | for (int i = 0; i < werte.length; | ||
+ | | ||
+ | } | ||
+ | |||
+ | println(new ArrayTool().summe(werte)); | ||
+ | |||
+ | class ArrayTool { | ||
+ | |||
+ | int summe(int[] werte) { | ||
+ | int summe = 0; | ||
+ | for (int i = 0; i < werte.length; | ||
+ | summe += werte[i]; | ||
+ | } | ||
+ | | ||
+ | return summe; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[.arbeitsteiligLoesung: | ||
+ | |||
+ | ==== Für Interessierte: | ||
+ | <WRAP center round info 80%> | ||
+ | Besitzt ein Interface nur eine einzige Methode, so nennt man es **functional interface**. Das Interface '' | ||
+ | An jeder Stelle, an der ein Objekt einer Klasse erwartet wird, die ein functional interface implementiert, | ||
+ | <code java> | ||
+ | (parameter 1, ..., parameter n) -> { Anweisungen } | ||
+ | </ | ||
+ | Lambda functions sind ein Ersatz für die in vielen anderen Programmiersprachen verfügbaren **closures**, | ||
+ | * 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. | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | SystemTools.setSpeed(8); | ||
+ | for (int i = 0; i < 10; i++) { | ||
+ | | ||
+ | | ||
+ | for (int j = 0; j < 10; j++) { | ||
+ | println(name + " counts: " + j); | ||
+ | } | ||
+ | }); | ||
+ | | ||
+ | } | ||
+ | |||
+ | while (true); | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ |
parallelism/start.1734679262.txt.gz · Zuletzt geändert: 2024/12/20 07:21 von Martin Pabst