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:46] – martin | api:documentation:threads:start [2024/10/28 21:34] (aktuell) – [Synchronized-Methode] martin | ||
---|---|---|---|
Zeile 25: | Zeile 25: | ||
</ | </ | ||
+ | ===== 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? | ||
+ | </ | ||
Zeile 36: | Zeile 75: | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
- | Incrementer | + | Worker |
| | ||
| | ||
Zeile 53: | 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 80: | 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! | ||
+ | </ | ||
< | < | ||
Zeile 90: | Zeile 141: | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
- | | + | |
| | ||
| | ||
Zeile 133: | Zeile 184: | ||
</ | </ | ||
+ | |||
+ | |||
+ | ===== Monitorkonzept ===== | ||
+ |
api/documentation/threads/start.1730061982.txt.gz · Zuletzt geändert: 2024/10/27 21:46 von martin