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/17 17:02] – [Begriffe] Martin Pabst | parallelism: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, | * 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 14: | Zeile 18: | ||
* Sind mehrere Prozessorkerne vorhanden, so können Threads **gleichzeitig** ausgeführt werden. Nebenläufigkeit liegt aber auch vor, wenn das Betriebssystem dafür sorgt, dass ein Prozessor die Anweisungen mehrerer Threads abwechselnd ausführt (z.B. 10 Anweisungen des ersten Threads, dann 10 des zweiten, dann 10 des ersten usw.). | * Sind mehrere Prozessorkerne vorhanden, so können Threads **gleichzeitig** ausgeführt werden. Nebenläufigkeit liegt aber auch vor, wenn das Betriebssystem dafür sorgt, dass ein Prozessor die Anweisungen mehrerer Threads abwechselnd ausführt (z.B. 10 Anweisungen des ersten Threads, dann 10 des zweiten, dann 10 des ersten usw.). | ||
</ | </ | ||
+ | |||
+ | ===== Threads in Java ===== | ||
+ | <WRAP center round info 80%> | ||
+ | Jedes Objekt der Klasse '' | ||
+ | Um Code in der Methode '' | ||
+ | * Wir schreiben eine Unterklasse von '' | ||
+ | * Wir schreiben eine Klasse (z.B. '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Beispiel 1: Überschreiben der run()-Methode ==== | ||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | SystemTools.setSpeed(8); | ||
+ | for (int i = 0; i < 10; i++) { | ||
+ | new MyThread(" | ||
+ | } | ||
+ | |||
+ | while (true); | ||
+ | |||
+ | class MyThread extends Thread { | ||
+ | |||
+ | | ||
+ | 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 2: 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++; | ||
+ | |||
+ | | ||
+ | |||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | ==== 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++; | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== 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.1734454961.txt.gz · Zuletzt geändert: 2024/12/17 17:02 von Martin Pabst