uio--WebPageMain-Module

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.

Abbildung: Java Tiers B

(ContentInstance ContentInstance-Java-Tiers-B)

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.

ThreadPoolExecutor

JAVA-B4 | ThreadPoolExecutor & Custom Executors

Die Klasse ThreadPoolExecutor ist die zentrale Implementierungsklasse für die Interfaces Executor, ExecutorService und ScheduledExecutorService und zugleich die Basisklasse für den ScheduledThreadPoolExecutor.

ThreadPoolExecutor

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


    UI ORGANIZED.

    UIO3 Es ist einfacher als Du denkst.

    Stelle noch heute Deine Anfrage.

    uio--WebPageFooter-Module