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.