pp.10.01.Rendezvous
CSP mit Java-Mitteln
- Projekt:
pp.10.01.Rendezvous
- Bearbeitungszeit: 20 Minuten
- Musterlösung: 10 Minuten
- Kompatibilität: mindestens Java SE 10
In den Kommentaren der (ansonsten leeren) Klasse Sum
im Package pp
ist ein Go-Programm, das die beiden Zahlen 1
und 2
unter Zuhilfenahme von Go Co-Routinen (das sind nebenläufige Programmteile in der Programmiersprache Go, die “leichtgewichtiger” als Java-Threads sind) berechnet.
package main
import "fmt"
func tasker (o, r chan int, d chan bool) {
o <- 1; o <- 2
fmt.Println (<-r); d <- true
}
func add (o, r chan int) {
r <- ((<-o) + (<-o))
}
func main () {
operand, result := make(chan int), make(chan int)
done:= make(chan bool)
go tasker (operand, result, done)
go add (operand, result)
<-done
}
Das Go-Programm besteht aus drei Funktionen. Dabei ist die Funktion main
der Einstiegspunkt in die Abarbeitung (vergleichbar zur main
-Method ein Java). In der main
-Funktion werden drei Kanäle ohne Kapazitätsbeschränkung erzeugt. Die Kanäle operand
und result
sind auf den Typ int
festgelegt und der Kanal done
kann nur Werte vom Typ bool
beinhalten.
Das Symbol :=
ist eine Zuweisung des Wertes der rechten Seite an die Variable auf der linken Seite mit gleichzeitiger Deklaration der Variable auf den Typ des Wertes auf der rechten Seite.
Nachdem die Kanäle erzeugt wurden, werden die beiden Funktionen tasker
und add
nebenläufig als Go-Routinen gestartet (wegen des Schlüsselwortes go
). Der Aufruf von go
ist asynchron, d.h. er blockiert nicht, bis der Wert der Funktion berechnet wurde. Im Gegensatz zu Futures
oder Promises kann man in Go nicht direkt oder indirekt auf das Resultat einer Go-Co-Routine zugreifen. Stattdessen muss das Ergebnis von der nebenläufig ausgeführten Funktion in einen Kanal geschrieben werden.
tasker
schreibt die Werte 1 und 2 in den Kanal, der als Parameter o
übergeben wurde. Wegen des Aufrufs von tasker
ist das der Kanal operand
. tasker
liest dann einen Wert aus dem Kanal r
(das ist result
) und schreibt dann den Wert true
in den Kanal d
(also done
).
add
liest zwei Werte aus dem Kanal o
(also operand
), addiert sie und schreibt das Ergebnis in den Kanal r
(result
).
Aufgabe
Entwickeln Sie eine strukturell vergleichbare Variante dieses Programms in Java unter Zuhilfenahme von zwei Threads (zusätzlich zum main
-Thread). Verwenden Sie LinkedBlockingQueue
, um die Go-Kanäle nachzubilden.