api:documentation:threads:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
api:documentation:threads:start [2024/10/27 21:34] – martin | api:documentation:threads:start [2024/10/28 21:34] (aktuell) – [Synchronized-Methode] martin | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Threads, Synchronisation ====== | ====== Threads, Synchronisation ====== | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | Viele aktuelle Prozessoren haben mehr als einen Kern und sind so in der Lage, mehrere Programme gleichzeitig auszuführen. Die Programmiersprache Java ermöglicht es, dies auszunutzen und mehrere Methoden zu starten, die dann gleichzeitig ausgeführt werden. Mann spricht dann von mehreren **Threads** (" | ||
+ | Genauer: | ||
+ | * Falls genug Prozessorkerne zur Verfügung stehen, werden die Threads echt parallel ausgeführt. | ||
+ | * Falls nicht genug Prozessorkerne zur Verfügung stehen, werden die Threads abwechselnd pausiert/ | ||
+ | |||
+ | Um einen Thread parallel zum Hauptprogramm zu starten schreibt man eine Klasse (z.B. '' | ||
+ | <code java> | ||
+ | class MyTask implements Runnable { | ||
+ | void run(){ | ||
+ | // Die Anweisungen, | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | Anschließend übergibt man ein '' | ||
+ | <code java> | ||
+ | Thread t = new Thread(new MyTask()); | ||
+ | t.start(); | ||
+ | |||
+ | // Alle Anweisungen ab hier werden schon parallel zur run-Methode des MyTask-Objekts ausgeführt! | ||
+ | </ | ||
+ | Die '' | ||
+ | </ | ||
+ | |||
+ | ===== Beispiel 1: 11 Threads zählen gleichzeitig ===== | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | SystemTools.setSpeed(8); | ||
+ | |||
+ | class MyTask implements Runnable { | ||
+ | void run() { | ||
+ | for (int i = 0; i < 20; i++) { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | for (int j = 0; j < 10; j++) { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | for (int k = 0; k < 10; k++) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ====== Race condition und Lösungen ====== | ||
+ | |||
+ | <WRAP center round todo 80%> | ||
+ | Im folgenden Beispiel gibt es **nur ein einziges** Objekt der Klasse '' | ||
+ | Am Ende der Arbeit meldet jeder Thread den aktuellen Zustand des Counters. Man würde erwarten, dass der Thread, der als letztes fertig wird, die Zahl | ||
+ | 3000000 ausgibt. \\ \\ | ||
+ | * Starten Sie das Programm mehrmals und sehen Sie sich die Ausgabe an. | ||
+ | * Wie lässt sich die Ausgabe erklären? | ||
+ | </ | ||
< | < | ||
- | <div class=" | + | <div class=" |
<script type=" | <script type=" | ||
Zeile 11: | Zeile 75: | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
- | Incrementer | + | Worker |
| | ||
| | ||
Zeile 28: | Zeile 92: | ||
- | class Incrementer | + | class Worker |
| | ||
long increment = 0; | long increment = 0; | ||
- | int index; | ||
- | Incrementer(Counter counter, long increment, int index) { | + | Worker(Counter counter, long increment) { |
this.increment = increment; | this.increment = increment; | ||
this.counter = counter; | this.counter = counter; | ||
- | this.index = index; | ||
} | } | ||
| | ||
for (long i = 0; i < increment; i++) { | for (long i = 0; i < increment; i++) { | ||
- | if(i % (increment/ | + | if(i % (increment/ |
| | ||
} | } | ||
- | println("Thread | + | println(Thread.currentThread().getName() |
} | } | ||
Zeile 55: | Zeile 117: | ||
</ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | {{ : | ||
+ | Im rechts stehenden Sequenzdiagramm ist zu sehen, was passiert, wenn zwei Threads gleichzeitig die Methode '' | ||
+ | Man nennt diesen Effekt eine **race condition**. Sie entsteht dadurch, dass die Anweisungen in der Methode '' | ||
+ | </ | ||
+ | |||
+ | ===== Synchronized-Methode ===== | ||
+ | <WRAP center round info 80%> | ||
+ | {{ : | ||
+ | Wir brauchen eine Möglichkeit, | ||
+ | * Vergleichen Sie die Deklaration der Methode '' | ||
+ | * Starten Sie das Programm mehrmals. Erklären Sie die Ausgabe! | ||
+ | </ | ||
< | < | ||
- | <div class=" | + | <div class=" |
<script type=" | <script type=" | ||
Zeile 65: | Zeile 141: | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
- | | + | |
| | ||
| | ||
Zeile 108: | Zeile 184: | ||
</ | </ | ||
+ | |||
+ | |||
+ | ===== Monitorkonzept ===== | ||
+ |
api/documentation/threads/start.1730061249.txt.gz · Zuletzt geändert: 2024/10/27 21:34 von martin