%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

%Kopfzeile
\ihead{Java}
\chead{}
\ohead{http://kohnlehome.de/java/forkjoin.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
Java: Fork-Join
\end{center}

\section*{Fork-Join-Pattern}
\begin{verbatim}
LÖSE-PROBLEM (P)
     Wenn P klein genug
         Löse P sequenziell
     Sonst
         Teile P in kleinerer Teilprobleme P1 und P2
         Fork: LÖSE-PROBLEM (P1)
         Fork: LÖSE-PROBLEM (P2)
         Join
\end{verbatim}

\section*{java.util.concurrent.RecursiveAction (ohne Rückgabewert)}
\subsection*{RecursiveAction.java}
\begin{verbatim}
class MyRecursiveAction extends RecursiveAction<INPUTDATA> {
    private INPUTDATA data;    

    public MyRecursiveAction(INPUTDATA data) {
        this.data = data;        
    }

    protected void compute() {
        if (data klein genug) {
            // sequenzielle Berechnung
        } else {
            // data aufteilen in data1 und data2            

            // Beide Tasks parallel ausführen
            MyRecursiveAction task1 = new MyRecursiveAction(data1);
            MyRecursiveAction task2 = new MyRecursiveAction(data2);            
            invokeAll(task1, task2);           
        }
    }
}
\end{verbatim}

\subsection*{Aufruf}
\begin{verbatim}
MyRecursiveAction rootTask = new MyRecursiveAction(data);
rootTask.invoke();
\end{verbatim}

\newpage

\section*{java.util.concurrent.RecursiveTask (mit Rückgabewert)}
\subsection*{MyRecursiveTask.java}
\begin{verbatim}
class MyRecursiveTask extends RecursiveTask<INPUTDATA> {
    private INPUTDATA data;    

    public MyRecursiveTask(INPUTDATA data) {
        this.data = data;        
    }

    protected RETURNDATA compute() {
        if (data klein genug) {
            // sequenzielle Berechnung
        } else {
            // data aufteilen in data1 und data2            

            // Beide Tasks parallel ausführen
            MyRecursiveTask task1 = new MyRecursiveTask(data1);
            MyRecursiveTask task2 = new MyRecursiveTask(data2);            
            invokeAll(task1, task2);

            // Ergebnisse der beiden Tasks wieder zusammenführen
            RETURNDATA result = zusammenbauen(task1.join(), task2.join());
            return result;
        }
    }
}
\end{verbatim}

\subsection*{Aufruf}
\begin{verbatim}
MyRecursiveTask rootTask = new MyRecursiveTask(data);
rootTask.invoke();
RETURNDATA result = rootTask.join();
\end{verbatim}


\end{document}
