- JAVA-B4 | Overview
- JAVA-B4 | Parallel Computing
- JAVA-B4 | Threads & Runnables
- JAVA-B4 | Thread Lifecycle
- JAVA-B4 | Daemon Threads
- JAVA-B4 | Thread Priority
- JAVA-B4 | Thread Notification
- JAVA-B4 | Concurrent API (Intro)
- JAVA-B4 | Technischer Hintergrund
- JAVA-B4 | Executors (Übersicht)
- JAVA-B4 | Callable & Future
- JAVA-B4 | Future-List & invokeAll
- JAVA-B4 | Executors (#350)
- JAVA-B4 | Scheduled Executor Service
- JAVA-B4 | ThreadPoolExecutor & Custom Executors
- JAVA-B4 | Synchronizers (Überblick)
- JAVA-B4 | CountDownLatch
- JAVA-B4 | CyclicBarrier
- JAVA-B4 | Phaser
- JAVA-B4 | Exchanger
- JAVA-B4 | Semaphore
JAVA-B4
Parallel Computing (Parallelism)
Parallelism
Multithreading
Klassische Threads
Threads & Runnables
Overview
Thread (Begriff)
DruckThread
DruckRunnable
ThreadDemo
Output
Thread Lifecycle
Overview
start()
run()
join()
stop()?
StartRunJoinDemo Example
Von allein endende Threads
Threads mit while(criteria)
Daemon-Threads
Overview
ThreadDaemonDemo
Daemon (Summary)
Thread-Priority
Overview
t.setPriority(..)
MachineThread Klasse (Example)
ThreadPriorityDemo (Example)
Thread Notification
Grundlagen
wait
notify
notifyAll
sleep
sleep vs. wait
Thread Notification Demo
sychronized(monitor)
Notification/Monitor Zusammenfassung
Concurrent API
Vom Thread zur Concurrent API
Was ist Concurrency?
Was ist Concurrency?
Problemstellungen bei herkömmlichen Threads
Features der Concurrent API
Warum: Bedeutung des Umstiegs
Themenüberblick
Technischer Hintergrund
Thread.sleep(0, 500_000)
System.nanoTime()
Executors (Übersicht) #310
ExecutorService (Page)
Begriffsbestimmung
Excetutor
.execute()
ExecutorService (Begriff)
ExecutorService Interface Methoden
Mehrere Callables und Runnables auf einmal starten
Kontrolliertes Beenden
Executors-Utilily Klasse
newCachedThreadPool()
newSingleThreadExecutor()
newFixedThreadPool(int nThreads)
newWorkStealingPool()
newScheduledThreadPool(int corePoolSize)
Beispiel
ForkJoinPool, RecursiveTask, Executors Example#09
A | B1,B2,B3 | C mit Summenbildung.
Executor vs. ExecutorService Example#10
Executors.newFixedThreadPool(2)
Beispiel
Zusammenfassung Executors
Callable, Future #330
Callable Future (Begriff)
Callable Interface (Begriff)
Begriff
Callable erzeugen
Callable verwenden
Future
Beispiel
Future-Listen mit invokeAll
Was sind Future-Listen?
Wie erzeuge ich Future-Listen?
Wann blockt eine Future-Liste?
Beispiel mit 12 Callables in 4 Gruppen
Executors (#350) @! Bis auf Hinweis doppelt
Overview
Executor (Begriff)
ExecutorService (Begriff)
Executors.new~ Factory Methoden
Executors für ThreadPoolExecutor mit fixed Pool
ScheduledExecutorService
ScheduledExecutorService
Superklasse ExecutorService
schedule(*)
scheduleAtFixedRate(*)
scheduleWithFixedDelay(*)
ScheduledExecutorService (xmpl)
ProductClock(Main, Bsp.)
AbstractMachine**
AbstractMaterial**
Coal/Iron/Steel**
Coal-/Iron-/Steel-Machine**
Material**
ProductionBus-Machine**
Storage T**
ThreadPoolExecutor (Detail)
Executor Implementierung
ThreadPoolExecutor (Term)
ThreadPoolExecutor Beispiele
"FixedSizeExecutorExample" EXAMPLE C20
"CachedExecutorExample" EXAMPLE C21
SynchronousQueue
"ScheduledExecutorExample" EXAMPLE C22
"CustomSingleThreadExecutorRunnableComponent" EXAMPLE C23
"CustomPolicyRejectedExecutorExample" EXAMPLE C24
"PrioritizedCombinerRunnableComponent" EXAMPLE C30
"BufferingRejectedTasksExample" EXAMPLE C31
Java RejectedExecutionHandler
ThreadPoolExecutor FAQ
Synchronizer
Synchronizer (overview)
Synchronizer Begriff
CountDownLatch
CountDownLatch Example
CyclicBarrier
CyclicBarrier Example (@Zeit ausgeben!)
Phaser
Phaser Example(@Erl!)
Exchanger
Exchanger ping/pong
Semaphore
CompletableFuture
async!!!
SemaphoreCompletableFutureDemo (@!?)
Monitoring
JMX
ThreadPoolExecutor "live" überwachen
getActiveCount()
getPoolSize()
getCompletedTaskCount()
getQueue().size()
Concurrency
Example:DeterministicCopy @todo FILE LINK FEHLT!
Example:NonDeterministicCopy @todo FILE LINK FEHLT!
Kapitel java.util.concurrent.Flow @!fehltReactive Flow @!fehltPublisher TSubscriber TSubscription TProcressor TProcressor T
Overview
JAVA-B4 | Overview
Parallel Programming, Parallel Computing, Multithreading, Single-Threading, MainThread, nebenläufige Programmierung, asynchrone Programmierung ...
In diesem Themenbereich beginnen wir mit einem Einblick in herkömmliche Threads sowie Runnables und steigen aber gleich tief in die Java Concurrency API Interfaces und Klassen ein. Die Prinzipien und Problemstellung rund und Parallel Computing sowie die gängigen Klassen nebst dem Unterschied zwischen blockenden, nicht-blockenden Threads sowie synchronisierten und nicht synchronisierten Membern von Klassen ist für die Collection Stream API dringend anzuraten, um Concurrent Modification Exceptions CMEs zu vermeiden.
Concurrency
JAVA-B4 | Parallel Computing
In einem ersten Schritt zur Einführung in Parallel Computing und damit nebenläufige Programmierung geben wir einen grundlegenden Überblick über die maßgebenden Prinzipien und Begriffe.
Java unterstützt wirkliches Multithreading im Gegensatz zu der ähnlich klingenden Programmiersprache JavaScript, welche single-threaded ist. Dieses führt zu einer ganzen Reihe von Features und damit Fähigkeiten, die Java bietet. Es gilt aber im Gegenzug auch zu verstehen, welche Folgen diese technischen Möglichkeiten haben, wenn man denn die möglichen Problemstellungen nicht kennt.
Threads & Runnables
JAVA-B4 | Threads & Runnables
In einem ersten Schritt zur Einführung in Parallel Computing und damit nebenläufige Programmierung geben wir einen grundlegenden Überblick über die maßgebenden Prinzipien und Begriffe.
Java unterstützt wirkliches Multithreading im Gegensatz zu der ähnlich klingenden Programmiersprache JavaScript, welche single-threaded ist. Dieses führt zu einer ganzen Reihe von Features und damit Fähigkeiten, die Java bietet. Es gilt aber im Gegenzug auch zu verstehen, welche Folgen diese technischen Möglichkeiten haben, wenn man denn die möglichen Problemstellungen nicht kennt.
Thread Lifecycle
JAVA-B4 | Thread Lifecycle
Jeder Threads hat einen Lebenszyklus. Er wird geschaffen, lebt, wird von Zeit zu Zeit mal ausgeführt oder schläft. Und irgendwann hat er ein selbst gewähltes Ende oder wird im Falle einer Dauerschleife mit anderen Maßnahmen beendet.
Das Problem in der Praxis: Man hat nicht nur einen Thread sondern 2 und mehr. Es beginnt schon damit, dass der MainThread der erste Thread ist, ohne dass wir diesen erzeugen müssen. Will man mehrere Threads erzeugen und an einer bestimmten Stelle im Programm nebenläufige Prozesse wieder zusammenführen, muss man nicht mit dem Fork und Join von Threads befassen. In diesem Themenblock wählen wir den grundlegenden Weg.
Daemon Threads
JAVA-B4 | Daemon Threads
Java differenziert mitunter User-Threads und Daemon-Threads. Der Unterschied ist bedeutsam.
In einem Beispiel zeigen wir, wie man User- und Daemon-Threads erzeugt und was hierbei die Folgen für den Programmverlauf und die Ausführung der eigentlichen nebenläufige Programmschritte sind.
Thread Priority
JAVA-B4 | Thread Priority
Wenn nebenläufige Programmbestandteile in einzelnen Threads laufen, kommt früher oder später der Zeitpunkt, an welchen diese die selbe Ressource wie beispielsweise ein Objekt verwenden wollen. Dieser Zugriff muss synchronisiert werden. Dieses Prinzip kann zugleich als Monitor verwendet werden.
In unserem Beispiel zeigen wir, welchen Einfluss die Vergabe von Prioritäten für MachineThread-Instanzen haben können, welche wir in eigenen Worker-Threads laufen lassen.
Thread Notification
JAVA-B4 | Thread Notification
Threads werden früher oder später Daten austauschen und hierbei den Zugriff auf Daten steuern müssen. Zu diesem Zweck ist es möglich, sich einen Monitor zu erzeugen und den Zugriff hierauf zu synchronisieren. Die Voraussetzung für eine Zusammenarbeit der Threads besteht darin, dass sich diese gegenseitig rund um den Lock des Monitors benachrichtigen können.
Wir erzeugen uns einen Monitor und spielen die Notification durch.
Concurrency
JAVA-B4 | Concurrent API (Intro)
Die Java Concurrency API erweitert maßgeblich das Erstellen, Verwalten und das Monitoring von Threads. Die Verwaltung über Executors, Tasks, Pools, Scheduler und mehr macht vieles einfacher. Die Voraussetzung besteht allerdings darin, dass man zuerst einmal versteht, welchen Typ an parallelen Architekturen man mit welchem Ansatz realisieren kann.
Bevor wir uns im Detail mit den jeweiligen Features befassen geben wir zu Beginn einen Einblick und Überblick, warum, wo und ab wann man diese Techniken einsetzen und herkömmliche Verfahren mit klassischen Threads überarbeiten sollte. Unsere Intro für den Sprung von Threads zu Concurrency API.
Technischer Hintergrund
JAVA-B4 | Technischer Hintergrund
Anmerkung: Es kam der Hinweis auf, dass einmal der technische Hintergrund von Threads im Hinblick auf Prozessoren, Single- und Multi-Threads genauer erklärt wird. Wir verweisen an diesem Aspekt darauf, dass es noch immer eine Suchmaschine Ihres Vertrauens, Wikipedia und eine KI gibt, welches alles aus zig Quellen gelesen hat und sich eine Antwort zurecht spinnen wird.
@todo: Die Beispiele mit exakteren Sleep-Optionen im Nano-Zeit-Bereich fehlen noch.
Die Zeitmessung kann sehr genau ausgeführt werden, aber ein Vertrauen auf sleep-Methoden ist zu ungenau. Es gibt spezielle Timer-Klassen.
Busy-Wait-Prinzip: Aktives warten ohne sleep mit Ssytem.nanoTime() und Zeitvergleich. Bringt einen der Prozessoren ggf. zum Glühen, ist dann aber zeitlich genauer.
Die Genauigkeit von Thread.sleep(..) unter Windows liegt bei ca. 15ms, bei Linux/Mac bei etwa 1ms.
Executor & ExecutorService
JAVA-B4 | Executors (Übersicht)
Übersicht: Executor-Interfaces und Klassen ersetzen in Java Concurrency das herkömmliche thread.start() sowie mitunter hierbei zugleich auch das Problem, wie man diesen Start für viele Threads und auch deren Ende eigentlich kontrolliert steuert.
Das wichtigste Grundprinzip eines Executors vorab:
Man erzeugt diese über die Factory-Methoden von Executors.*
Callable & Future
JAVA-B4 | Callable & Future | Overview
Callables und Futures: Klingt wie der Titel eines neuen Science-Fiction-Films. Callables bieten eine Reihe von Vorteilen gegenüber herkömmlichen Runnables. Ein ExecutorServices kann sie verwalten und für Entwickler damit den Einstieg in asynchrone Programmierung ermöglichen.
Futures bieten einen völlig neuen Aspekt im Parallel Computing, denn Entwickler müssen bei der Verwendung von Futures kaum noch verstehen, wie dieser Wert von wo beschafft wird, denn die Architektur der Callables, Executors und dergleichen kann verborgen werden.
Future-List
JAVA-B4 | Future-List & invokeAll
Future-List: invokeAll in Verbindung mit Futures.
Bevor wir uns im Detail mit den jeweiligen Features befassen geben wir zu Beginn einen Einblick und Überblick, warum, wo und ab wann man diese Techniken einsetzen und herkömmliche Verfahren mit klassischen Threads überarbeiten sollte. Unsere Intro für den Sprung von Threads zu Concurrency API.
Executors
JAVA-B4 | Executors (#350)
Mit dem Themenbereich der Executors beginnt der Einstieg in die Ausführung einzelner oder auch mehrerer Callables, geordnet, eher zufällig oder auch im Zeittakt. Executors betreffen Executor, ExecutorService, Scheduled~ Varianten sowie zugehörige Implementierungsklassen.
Wir geben einen ersten Gesamtüberblick als Voraussetzung für das Verständnis des Zusammenspiels aus Executor-Interfaces und dem späteren ThreadPoolExecutor.
Scheduled Executor
JAVA-B4 | Scheduled Executor Service
Die Interfaces Executor, ExecutorService, ScheduledExecutorServices sind eine Vererbungskette welche uns den Zugriff auf Methoden eines ThreadPoolExecutors ermöglichen.
scheduler.scheduleAtFixedRate(bus::fireTick, 0, 2, TimeUnit.SECONDS)
ist ein klassisches Pattern für die Verwendung eines Schedulers.
Synchronizer
JAVA-B4 | Synchronizers (Überblick)
Synchronizer stellen sicher, dass die jeweiligen Tasks im Verlauf synchronisiert werden können. Dieser Themenblock erklärt im Beispiel die jeweiligen Varianten.
Mal sollen alle Threads in zufälligerweise
laufen, und wie CountDownLatch wartet mit await() schlicht, bis alle
fertig sind. Es ist aber auch möglich, dass jeder Task selbst
darauf wartet, dass ein Phaser die nächste Phase freigibt.
CountDownLatch
JAVA-B4 | CountDownLatch
Hinweis: Klasse, Beschreibung und Beispiel siehe Synchronizers.
CyclicBarrier
JAVA-B4 | CyclicBarrier
Hinweis: Klasse, Beschreibung und Beispiel siehe Synchronizers.
Phaser
JAVA-B4 | Phaser
Hinweis: Klasse, Beschreibung und Beispiel siehe Synchronizers.
Exchanger
JAVA-B4 | Exchanger
Hinweis: Klasse, Beschreibung und Beispiel siehe Synchronizers.
Semaphore
JAVA-B4 | Semaphore
Hinweis: Klasse, Beschreibung und Beispiel siehe Synchronizers.
FootNotes
UIO3 Es ist einfacher als Du denkst.
Stelle noch heute Deine Anfrage.

