From 53803a654ac0c87923c22f8611b28524430cbad3 Mon Sep 17 00:00:00 2001 From: Sandro Leuchter Date: Mon, 2 Dec 2024 16:24:34 +0100 Subject: [PATCH] initial --- src/.gitignore | 1 + .../README.md | 7 ++ .../justfile | 18 ++++ .../pom.xml | 71 ++++++++++++++++ .../src/main/java/pp/InOutTuple.java | 56 +++++++++++++ .../src/main/java/pp/MonteCarloPiSeq.java | 46 +++++++++++ .../README.md | 7 ++ .../justfile | 18 ++++ .../pom.xml | 70 ++++++++++++++++ .../src/main/java/pp/InOutTuple.java | 56 +++++++++++++ .../src/main/java/pp/MonteCarloPiSeq.java | 48 +++++++++++ .../README.md | 7 ++ .../justfile | 18 ++++ .../pom.xml | 70 ++++++++++++++++ .../src/main/java/pp/InOutTuple.java | 56 +++++++++++++ .../src/main/java/pp/MonteCarloPiSeq.java | 48 +++++++++++ .../README.md | 7 ++ .../justfile | 18 ++++ .../pom.xml | 70 ++++++++++++++++ .../src/main/java/pp/InOutTuple.java | 63 ++++++++++++++ .../src/main/java/pp/MonteCarloPiFuture.java | 66 +++++++++++++++ .../src/main/java/pp/MonteCarloPiSeq.java | 48 +++++++++++ src/pp.08.03-CommonPool/README.md | 7 ++ src/pp.08.03-CommonPool/justfile | 21 +++++ src/pp.08.03-CommonPool/pom.xml | 70 ++++++++++++++++ .../src/main/java/pp/CommonPoolTest.java | 43 ++++++++++ .../README.md | 7 ++ .../justfile | 18 ++++ .../pom.xml | 70 ++++++++++++++++ .../src/main/java/pp/InOutTuple.java | 63 ++++++++++++++ .../src/main/java/pp/MonteCarloPiSeq.java | 48 +++++++++++ .../README.md | 7 ++ .../justfile | 18 ++++ .../pom.xml | 70 ++++++++++++++++ .../src/main/java/pp/InOutTuple.java | 63 ++++++++++++++ .../src/main/java/pp/MonteCarloPiCF1.java | 82 +++++++++++++++++++ .../src/main/java/pp/MonteCarloPiCF2.java | 60 ++++++++++++++ .../src/main/java/pp/MonteCarloPiSeq.java | 48 +++++++++++ 38 files changed, 1564 insertions(+) create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq/README.md create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq/justfile create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq/pom.xml create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq/src/main/java/pp/InOutTuple.java create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq/src/main/java/pp/MonteCarloPiSeq.java create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/README.md create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/justfile create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/pom.xml create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/src/main/java/pp/InOutTuple.java create mode 100644 src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/src/main/java/pp/MonteCarloPiSeq.java create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture/README.md create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture/justfile create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture/pom.xml create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture/src/main/java/pp/InOutTuple.java create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture/src/main/java/pp/MonteCarloPiSeq.java create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/README.md create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/justfile create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/pom.xml create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/InOutTuple.java create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/MonteCarloPiFuture.java create mode 100644 src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/MonteCarloPiSeq.java create mode 100644 src/pp.08.03-CommonPool/README.md create mode 100644 src/pp.08.03-CommonPool/justfile create mode 100644 src/pp.08.03-CommonPool/pom.xml create mode 100644 src/pp.08.03-CommonPool/src/main/java/pp/CommonPoolTest.java create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF/README.md create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF/justfile create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF/pom.xml create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF/src/main/java/pp/InOutTuple.java create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF/src/main/java/pp/MonteCarloPiSeq.java create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/README.md create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/justfile create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/pom.xml create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/InOutTuple.java create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiCF1.java create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiCF2.java create mode 100644 src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiSeq.java diff --git a/src/.gitignore b/src/.gitignore index 1f3bdcd..9fd6c58 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -8,3 +8,4 @@ */target/ */.apt_generated/ */.apt_generated_tests/ +*/.vscode/ diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq/README.md b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/README.md new file mode 100644 index 0000000..4613eaf --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/README.md @@ -0,0 +1,7 @@ +# Laboraufgabe "Monte-Carlo-Algorithmus zur Annäherung von pi - sequenziell" +- [Aufgabenstellung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-01-ConcurrencyMonteCarloPiSeq.html) +- [Musterlösung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-Solutions.html#laboraufgabe-monte-carlo-algorithmus-zur-annäherung-von-pi-sequenziell) + +# Materialien +- [Folien](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/slides/08-completableFuture.html) +- [Skript](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/notes/08-completableFuture.html) diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq/justfile b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/justfile new file mode 100644 index 0000000..6ca7111 --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/justfile @@ -0,0 +1,18 @@ +# Justfile (https://just.systems/) for starting Maven standard targets + +default: clean compile package + +exec class args: compile + mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}} +# exec class args: +# java -cp target/app.jar {{class}} {{args}} +clean: + mvn clean +compile: + mvn compile +test: compile + mvn test +javadoc: + mvn javadoc:javadoc +package: + mvn package diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq/pom.xml b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/pom.xml new file mode 100644 index 0000000..9aba5ed --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/pom.xml @@ -0,0 +1,71 @@ + + 4.0.0 + pp + pp.08.01-ConcurrencyMonteCarloPiSeq + 1.0-SNAPSHOT + jar + + + 16 + edge-SNAPSHOT + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + net.jcip + jcip-annotations + 1.0 + provided + + + + clean compile + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + private + en_US + + + + + diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq/src/main/java/pp/InOutTuple.java b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/src/main/java/pp/InOutTuple.java new file mode 100644 index 0000000..86f2182 --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/src/main/java/pp/InOutTuple.java @@ -0,0 +1,56 @@ +package pp; + +public record InOutTuple(int in, int out) { +} + +//record seit Java 16 (preview seit Java 14). +//identisch zu ... +//public final class InOutTuple { +// final private int in; +// final private int out; +// +// public InOutTuple(int in, int out) { +// this.in = in; +// this.out = out; +// } +// +// public int in() { +// return this.in; +// } +// +// public int out() { +// return this.out; +// } +// +// @Override +// public String toString() { +// return String.format("InOutTuple [in=%s, out=%s]", this.in, this.out); +// } +// +// @Override +// public int hashCode() { +// var prime = 31; +// var result = 1; +// result = (prime * result) + this.in; +// result = (prime * result) + this.out; +// return result; +// } +// +// @Override +// public boolean equals(Object obj) { +// if (this == obj) { +// return true; +// } +// if (!(obj instanceof InOutTuple)) { +// return false; +// } +// var other = (InOutTuple) obj; +// if (this.in != other.in) { +// return false; +// } +// if (this.out != other.out) { +// return false; +// } +// return true; +// } +//} diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq/src/main/java/pp/MonteCarloPiSeq.java b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/src/main/java/pp/MonteCarloPiSeq.java new file mode 100644 index 0000000..897131f --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq/src/main/java/pp/MonteCarloPiSeq.java @@ -0,0 +1,46 @@ +package pp; + +import java.util.Random; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Sequenzielle Berechnung (im Main-Thread) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiSeq { + static final int TOTAL_CYCLES = 10000000; + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + */ + public static void main(String... args) { + var result = getResultMonteCarloPiDraw(TOTAL_CYCLES); + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi); + } + +} diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/README.md b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/README.md new file mode 100644 index 0000000..4613eaf --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/README.md @@ -0,0 +1,7 @@ +# Laboraufgabe "Monte-Carlo-Algorithmus zur Annäherung von pi - sequenziell" +- [Aufgabenstellung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-01-ConcurrencyMonteCarloPiSeq.html) +- [Musterlösung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-Solutions.html#laboraufgabe-monte-carlo-algorithmus-zur-annäherung-von-pi-sequenziell) + +# Materialien +- [Folien](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/slides/08-completableFuture.html) +- [Skript](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/notes/08-completableFuture.html) diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/justfile b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/justfile new file mode 100644 index 0000000..6ca7111 --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/justfile @@ -0,0 +1,18 @@ +# Justfile (https://just.systems/) for starting Maven standard targets + +default: clean compile package + +exec class args: compile + mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}} +# exec class args: +# java -cp target/app.jar {{class}} {{args}} +clean: + mvn clean +compile: + mvn compile +test: compile + mvn test +javadoc: + mvn javadoc:javadoc +package: + mvn package diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/pom.xml b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/pom.xml new file mode 100644 index 0000000..90c78aa --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + pp + pp.08.01-ConcurrencyMonteCarloPiSeq_solution + 1.0-SNAPSHOT + jar + + + 16 + edge-SNAPSHOT + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + net.jcip + jcip-annotations + 1.0 + provided + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + private + en_US + + + + + \ No newline at end of file diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/src/main/java/pp/InOutTuple.java b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/src/main/java/pp/InOutTuple.java new file mode 100644 index 0000000..86f2182 --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/src/main/java/pp/InOutTuple.java @@ -0,0 +1,56 @@ +package pp; + +public record InOutTuple(int in, int out) { +} + +//record seit Java 16 (preview seit Java 14). +//identisch zu ... +//public final class InOutTuple { +// final private int in; +// final private int out; +// +// public InOutTuple(int in, int out) { +// this.in = in; +// this.out = out; +// } +// +// public int in() { +// return this.in; +// } +// +// public int out() { +// return this.out; +// } +// +// @Override +// public String toString() { +// return String.format("InOutTuple [in=%s, out=%s]", this.in, this.out); +// } +// +// @Override +// public int hashCode() { +// var prime = 31; +// var result = 1; +// result = (prime * result) + this.in; +// result = (prime * result) + this.out; +// return result; +// } +// +// @Override +// public boolean equals(Object obj) { +// if (this == obj) { +// return true; +// } +// if (!(obj instanceof InOutTuple)) { +// return false; +// } +// var other = (InOutTuple) obj; +// if (this.in != other.in) { +// return false; +// } +// if (this.out != other.out) { +// return false; +// } +// return true; +// } +//} diff --git a/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/src/main/java/pp/MonteCarloPiSeq.java b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/src/main/java/pp/MonteCarloPiSeq.java new file mode 100644 index 0000000..2aeb5e3 --- /dev/null +++ b/src/pp.08.01-ConcurrencyMonteCarloPiSeq_solution/src/main/java/pp/MonteCarloPiSeq.java @@ -0,0 +1,48 @@ +package pp; + +import java.util.Random; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Sequenzielle Berechnung (im Main-Thread) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiSeq { + static final int TOTAL_CYCLES = 10000000; + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + */ + public static void main(String... args) { + var now = System.currentTimeMillis(); + var result = getResultMonteCarloPiDraw(TOTAL_CYCLES); + var time = System.currentTimeMillis() - now; + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi + ", " + time + " ms"); + } + +} diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture/README.md b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/README.md new file mode 100644 index 0000000..3d33007 --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/README.md @@ -0,0 +1,7 @@ +# Laboraufgabe "Monte-Carlo-Algorithmus zur Annäherung von pi – mit Future" +- [Aufgabenstellung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-02-ConcurrencyMonteCarloPiFuture.html) +- [Musterlösung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-Solutions.html#laboraufgabe-monte-carlo-algorithmus-zur-annäherung-von-pi-mit-future) + +# Materialien +- [Folien](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/slides/08-completableFuture.html) +- [Skript](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/notes/08-completableFuture.html) diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture/justfile b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/justfile new file mode 100644 index 0000000..6ca7111 --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/justfile @@ -0,0 +1,18 @@ +# Justfile (https://just.systems/) for starting Maven standard targets + +default: clean compile package + +exec class args: compile + mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}} +# exec class args: +# java -cp target/app.jar {{class}} {{args}} +clean: + mvn clean +compile: + mvn compile +test: compile + mvn test +javadoc: + mvn javadoc:javadoc +package: + mvn package diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture/pom.xml b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/pom.xml new file mode 100644 index 0000000..ae6b99b --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + pp + pp.08.02-ConcurrencyMonteCarloPiFuture + 1.0-SNAPSHOT + jar + + + 16 + edge-SNAPSHOT + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + net.jcip + jcip-annotations + 1.0 + provided + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + private + en_US + + + + + \ No newline at end of file diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture/src/main/java/pp/InOutTuple.java b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/src/main/java/pp/InOutTuple.java new file mode 100644 index 0000000..86f2182 --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/src/main/java/pp/InOutTuple.java @@ -0,0 +1,56 @@ +package pp; + +public record InOutTuple(int in, int out) { +} + +//record seit Java 16 (preview seit Java 14). +//identisch zu ... +//public final class InOutTuple { +// final private int in; +// final private int out; +// +// public InOutTuple(int in, int out) { +// this.in = in; +// this.out = out; +// } +// +// public int in() { +// return this.in; +// } +// +// public int out() { +// return this.out; +// } +// +// @Override +// public String toString() { +// return String.format("InOutTuple [in=%s, out=%s]", this.in, this.out); +// } +// +// @Override +// public int hashCode() { +// var prime = 31; +// var result = 1; +// result = (prime * result) + this.in; +// result = (prime * result) + this.out; +// return result; +// } +// +// @Override +// public boolean equals(Object obj) { +// if (this == obj) { +// return true; +// } +// if (!(obj instanceof InOutTuple)) { +// return false; +// } +// var other = (InOutTuple) obj; +// if (this.in != other.in) { +// return false; +// } +// if (this.out != other.out) { +// return false; +// } +// return true; +// } +//} diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture/src/main/java/pp/MonteCarloPiSeq.java b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/src/main/java/pp/MonteCarloPiSeq.java new file mode 100644 index 0000000..2aeb5e3 --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture/src/main/java/pp/MonteCarloPiSeq.java @@ -0,0 +1,48 @@ +package pp; + +import java.util.Random; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Sequenzielle Berechnung (im Main-Thread) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiSeq { + static final int TOTAL_CYCLES = 10000000; + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + */ + public static void main(String... args) { + var now = System.currentTimeMillis(); + var result = getResultMonteCarloPiDraw(TOTAL_CYCLES); + var time = System.currentTimeMillis() - now; + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi + ", " + time + " ms"); + } + +} diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/README.md b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/README.md new file mode 100644 index 0000000..3d33007 --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/README.md @@ -0,0 +1,7 @@ +# Laboraufgabe "Monte-Carlo-Algorithmus zur Annäherung von pi – mit Future" +- [Aufgabenstellung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-02-ConcurrencyMonteCarloPiFuture.html) +- [Musterlösung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-Solutions.html#laboraufgabe-monte-carlo-algorithmus-zur-annäherung-von-pi-mit-future) + +# Materialien +- [Folien](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/slides/08-completableFuture.html) +- [Skript](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/notes/08-completableFuture.html) diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/justfile b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/justfile new file mode 100644 index 0000000..6ca7111 --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/justfile @@ -0,0 +1,18 @@ +# Justfile (https://just.systems/) for starting Maven standard targets + +default: clean compile package + +exec class args: compile + mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}} +# exec class args: +# java -cp target/app.jar {{class}} {{args}} +clean: + mvn clean +compile: + mvn compile +test: compile + mvn test +javadoc: + mvn javadoc:javadoc +package: + mvn package diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/pom.xml b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/pom.xml new file mode 100644 index 0000000..0ffd59d --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + pp + pp.08.02-ConcurrencyMonteCarloPiFuture_solution + 1.0-SNAPSHOT + jar + + + 16 + edge-SNAPSHOT + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + net.jcip + jcip-annotations + 1.0 + provided + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + private + en_US + + + + + \ No newline at end of file diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/InOutTuple.java b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/InOutTuple.java new file mode 100644 index 0000000..bea2f92 --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/InOutTuple.java @@ -0,0 +1,63 @@ +package pp; + +public record InOutTuple(int in, int out) { + InOutTuple add(InOutTuple other) { + return new InOutTuple(in() + other.in(), out() + other.out()); + } +} + +//record seit Java 16 (preview seit Java 14). +//identisch zu ... +//public final class InOutTuple { +// final private int in; +// final private int out; +// +// public InOutTuple(int in, int out) { +// this.in = in; +// this.out = out; +// } +// +// public int in() { +// return this.in; +// } +// +// public int out() { +// return this.out; +// } +// +// @Override +// public String toString() { +// return String.format("InOutTuple [in=%s, out=%s]", this.in, this.out); +// } +// +// @Override +// public int hashCode() { +// var prime = 31; +// var result = 1; +// result = (prime * result) + this.in; +// result = (prime * result) + this.out; +// return result; +// } +// +// @Override +// public boolean equals(Object obj) { +// if (this == obj) { +// return true; +// } +// if (!(obj instanceof InOutTuple)) { +// return false; +// } +// var other = (InOutTuple) obj; +// if (this.in != other.in) { +// return false; +// } +// if (this.out != other.out) { +// return false; +// } +// return true; +// } +// +// InOutTuple add(InOutTuple other) { +// return new InOutTuple(in() + other.in(), out() + other.out()); +// } +//} diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/MonteCarloPiFuture.java b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/MonteCarloPiFuture.java new file mode 100644 index 0000000..f095dcd --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/MonteCarloPiFuture.java @@ -0,0 +1,66 @@ +package pp; + +import java.util.LinkedList; +import java.util.Random; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Parallele Berechnung (mit Futures im FixedThreadPool) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiFuture { + static final int PARALLELISM = 8; + static final int TOTAL_CYCLES = 10000000; + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + * @throws ExecutionException + * @throws InterruptedException + */ + public static void main(String... args) + throws InterruptedException, ExecutionException { + var pool = Executors.newFixedThreadPool(PARALLELISM); + var futures = new LinkedList>(); + var now = System.currentTimeMillis(); + for (var i = 0; i < PARALLELISM; i++) { + futures.add(pool.submit(() -> getResultMonteCarloPiDraw( + TOTAL_CYCLES / PARALLELISM))); + } + pool.shutdown(); + var time = System.currentTimeMillis() - now; + var result = new InOutTuple(0, 0); + for (var f : futures) { + result = result.add(f.get()); + } + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi + ", " + time + " ms"); + } + +} diff --git a/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/MonteCarloPiSeq.java b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/MonteCarloPiSeq.java new file mode 100644 index 0000000..2aeb5e3 --- /dev/null +++ b/src/pp.08.02-ConcurrencyMonteCarloPiFuture_solution/src/main/java/pp/MonteCarloPiSeq.java @@ -0,0 +1,48 @@ +package pp; + +import java.util.Random; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Sequenzielle Berechnung (im Main-Thread) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiSeq { + static final int TOTAL_CYCLES = 10000000; + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + */ + public static void main(String... args) { + var now = System.currentTimeMillis(); + var result = getResultMonteCarloPiDraw(TOTAL_CYCLES); + var time = System.currentTimeMillis() - now; + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi + ", " + time + " ms"); + } + +} diff --git a/src/pp.08.03-CommonPool/README.md b/src/pp.08.03-CommonPool/README.md new file mode 100644 index 0000000..db5c375 --- /dev/null +++ b/src/pp.08.03-CommonPool/README.md @@ -0,0 +1,7 @@ +# Laboraufgabe "commonPool" +- [Aufgabenstellung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-03-CommonPool.html) +- [Musterlösung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-Solutions.html#laboraufgabe-commonpool) + +# Materialien +- [Folien](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/slides/08-completableFuture.html) +- [Skript](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/notes/08-completableFuture.html) diff --git a/src/pp.08.03-CommonPool/justfile b/src/pp.08.03-CommonPool/justfile new file mode 100644 index 0000000..a6ad318 --- /dev/null +++ b/src/pp.08.03-CommonPool/justfile @@ -0,0 +1,21 @@ +# Justfile (https://just.systems/) for starting Maven standard targets + +default: clean compile package + +par parallelism: + mvn exec:java -Dexec.mainClass=pp.CommonPoolTest -Djava.util.concurrent.ForkJoinPool.common.parallelism={{parallelism}} + +exec class args: compile + mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}} +# exec class args: +# java -cp target/app.jar {{class}} {{args}} +clean: + mvn clean +compile: + mvn compile +test: compile + mvn test +javadoc: + mvn javadoc:javadoc +package: + mvn package diff --git a/src/pp.08.03-CommonPool/pom.xml b/src/pp.08.03-CommonPool/pom.xml new file mode 100644 index 0000000..5935fa4 --- /dev/null +++ b/src/pp.08.03-CommonPool/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + pp + pp.08.03-CommonPool + 1.0-SNAPSHOT + jar + + + 10 + edge-SNAPSHOT + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + net.jcip + jcip-annotations + 1.0 + provided + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + private + en_US + + + + + diff --git a/src/pp.08.03-CommonPool/src/main/java/pp/CommonPoolTest.java b/src/pp.08.03-CommonPool/src/main/java/pp/CommonPoolTest.java new file mode 100644 index 0000000..2d23d1b --- /dev/null +++ b/src/pp.08.03-CommonPool/src/main/java/pp/CommonPoolTest.java @@ -0,0 +1,43 @@ +package pp; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.Future; +import java.util.LinkedList; + +public class CommonPoolTest { + private static void sleep() { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private static void output(int task, String event) { + var thread = Thread.currentThread().getName(); + System.out.printf("Task-%02d %s by %s\n", task, event, thread); + } + + public static void main(String... args) + throws InterruptedException, ExecutionException { + var cores = Runtime.getRuntime().availableProcessors(); + var commonPool = ForkJoinPool.commonPool(); + System.out.println("# Cores: " + cores); + System.out.println("# Threads: " + commonPool.getParallelism()); + var futures = new LinkedList>(); + for (var task : new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }) { + futures.add(commonPool.submit(() -> { + output(task, "started"); + sleep(); + output(task, "finished"); + return task; + })); + output(task, "submitted"); + } + for (var future : futures) { + output((int) future.get(), "delivered"); + } + commonPool.shutdown(); + } +} diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF/README.md b/src/pp.08.04-ConcurrencyMonteCarloPiCF/README.md new file mode 100644 index 0000000..a1ac83a --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF/README.md @@ -0,0 +1,7 @@ +# Laboraufgabe "Monte-Carlo-Algorithmus zur Annäherung von pi – mit CompletableFuture" +- [Aufgabenstellung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-04-ConcurrencyMonteCarloPiCF.html) +- [Musterlösung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-Solutions.html#laboraufgabe-monte-carlo-algorithmus-zur-annäherung-von-pi-mit-completablefuture) + +# Materialien +- [Folien](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/slides/08-completableFuture.html) +- [Skript](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/notes/08-completableFuture.html) diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF/justfile b/src/pp.08.04-ConcurrencyMonteCarloPiCF/justfile new file mode 100644 index 0000000..6ca7111 --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF/justfile @@ -0,0 +1,18 @@ +# Justfile (https://just.systems/) for starting Maven standard targets + +default: clean compile package + +exec class args: compile + mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}} +# exec class args: +# java -cp target/app.jar {{class}} {{args}} +clean: + mvn clean +compile: + mvn compile +test: compile + mvn test +javadoc: + mvn javadoc:javadoc +package: + mvn package diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF/pom.xml b/src/pp.08.04-ConcurrencyMonteCarloPiCF/pom.xml new file mode 100644 index 0000000..0ceaf09 --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + pp + pp.08.04-ConcurrencyMonteCarloPiCF + 1.0-SNAPSHOT + jar + + + 16 + edge-SNAPSHOT + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + net.jcip + jcip-annotations + 1.0 + provided + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + private + en_US + + + + + \ No newline at end of file diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF/src/main/java/pp/InOutTuple.java b/src/pp.08.04-ConcurrencyMonteCarloPiCF/src/main/java/pp/InOutTuple.java new file mode 100644 index 0000000..ef7bd8f --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF/src/main/java/pp/InOutTuple.java @@ -0,0 +1,63 @@ +package pp; + +public record InOutTuple(int in, int out) { + InOutTuple add(InOutTuple other) { + return new InOutTuple(in() + other.in(), out() + other.out()); + } +} + +//record seit Java 15 (preview in Java 14). +//identisch zu ... +//public final class InOutTuple { +// final private int in; +// final private int out; +// +// public InOutTuple(int in, int out) { +// this.in = in; +// this.out = out; +// } +// +// public int in() { +// return this.in; +// } +// +// public int out() { +// return this.out; +// } +// +// @Override +// public String toString() { +// return String.format("InOutTuple [in=%s, out=%s]", this.in, this.out); +// } +// +// @Override +// public int hashCode() { +// var prime = 31; +// var result = 1; +// result = (prime * result) + this.in; +// result = (prime * result) + this.out; +// return result; +// } +// +// @Override +// public boolean equals(Object obj) { +// if (this == obj) { +// return true; +// } +// if (!(obj instanceof InOutTuple)) { +// return false; +// } +// var other = (InOutTuple) obj; +// if (this.in != other.in) { +// return false; +// } +// if (this.out != other.out) { +// return false; +// } +// return true; +// } +// +// InOutTuple add(InOutTuple other) { +// return new InOutTuple(in() + other.in(), out() + other.out()); +// } +//} diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF/src/main/java/pp/MonteCarloPiSeq.java b/src/pp.08.04-ConcurrencyMonteCarloPiCF/src/main/java/pp/MonteCarloPiSeq.java new file mode 100644 index 0000000..2aeb5e3 --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF/src/main/java/pp/MonteCarloPiSeq.java @@ -0,0 +1,48 @@ +package pp; + +import java.util.Random; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Sequenzielle Berechnung (im Main-Thread) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiSeq { + static final int TOTAL_CYCLES = 10000000; + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + */ + public static void main(String... args) { + var now = System.currentTimeMillis(); + var result = getResultMonteCarloPiDraw(TOTAL_CYCLES); + var time = System.currentTimeMillis() - now; + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi + ", " + time + " ms"); + } + +} diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/README.md b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/README.md new file mode 100644 index 0000000..a1ac83a --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/README.md @@ -0,0 +1,7 @@ +# Laboraufgabe "Monte-Carlo-Algorithmus zur Annäherung von pi – mit CompletableFuture" +- [Aufgabenstellung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-04-ConcurrencyMonteCarloPiCF.html) +- [Musterlösung](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/labs/08-Solutions.html#laboraufgabe-monte-carlo-algorithmus-zur-annäherung-von-pi-mit-completablefuture) + +# Materialien +- [Folien](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/slides/08-completableFuture.html) +- [Skript](https://services.informatik.hs-mannheim.de/~s.leuchter/pp/notes/08-completableFuture.html) diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/justfile b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/justfile new file mode 100644 index 0000000..6ca7111 --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/justfile @@ -0,0 +1,18 @@ +# Justfile (https://just.systems/) for starting Maven standard targets + +default: clean compile package + +exec class args: compile + mvn exec:java -Dexec.args="{{args}}" -Dexec.mainClass={{class}} +# exec class args: +# java -cp target/app.jar {{class}} {{args}} +clean: + mvn clean +compile: + mvn compile +test: compile + mvn test +javadoc: + mvn javadoc:javadoc +package: + mvn package diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/pom.xml b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/pom.xml new file mode 100644 index 0000000..6635ab7 --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + pp + pp.08.04-ConcurrencyMonteCarloPiCF_solution + 1.0-SNAPSHOT + jar + + + 16 + edge-SNAPSHOT + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + net.jcip + jcip-annotations + 1.0 + provided + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.9.0 + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.5.0 + + private + en_US + + + + + \ No newline at end of file diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/InOutTuple.java b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/InOutTuple.java new file mode 100644 index 0000000..ef7bd8f --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/InOutTuple.java @@ -0,0 +1,63 @@ +package pp; + +public record InOutTuple(int in, int out) { + InOutTuple add(InOutTuple other) { + return new InOutTuple(in() + other.in(), out() + other.out()); + } +} + +//record seit Java 15 (preview in Java 14). +//identisch zu ... +//public final class InOutTuple { +// final private int in; +// final private int out; +// +// public InOutTuple(int in, int out) { +// this.in = in; +// this.out = out; +// } +// +// public int in() { +// return this.in; +// } +// +// public int out() { +// return this.out; +// } +// +// @Override +// public String toString() { +// return String.format("InOutTuple [in=%s, out=%s]", this.in, this.out); +// } +// +// @Override +// public int hashCode() { +// var prime = 31; +// var result = 1; +// result = (prime * result) + this.in; +// result = (prime * result) + this.out; +// return result; +// } +// +// @Override +// public boolean equals(Object obj) { +// if (this == obj) { +// return true; +// } +// if (!(obj instanceof InOutTuple)) { +// return false; +// } +// var other = (InOutTuple) obj; +// if (this.in != other.in) { +// return false; +// } +// if (this.out != other.out) { +// return false; +// } +// return true; +// } +// +// InOutTuple add(InOutTuple other) { +// return new InOutTuple(in() + other.in(), out() + other.out()); +// } +//} diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiCF1.java b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiCF1.java new file mode 100644 index 0000000..2de7766 --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiCF1.java @@ -0,0 +1,82 @@ +package pp; + +import java.util.Random; +import java.util.concurrent.CompletableFuture; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Parallele Berechnung (im Common Pool über Completable Future) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiCF1 { + static final int TOTAL_CYCLES = 10000000; + static final int PARALLELISM = 7; + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + */ + public static void main(String... args) { + var now = System.currentTimeMillis(); + var result = CompletableFuture.supplyAsync( + () -> getResultMonteCarloPiDraw(TOTAL_CYCLES / PARALLELISM)) + .thenCombineAsync( + CompletableFuture + .supplyAsync(() -> getResultMonteCarloPiDraw( + TOTAL_CYCLES / PARALLELISM)), + (InOutTuple x, InOutTuple y) -> x.add(y)) + .thenCombineAsync( + CompletableFuture + .supplyAsync(() -> getResultMonteCarloPiDraw( + TOTAL_CYCLES / PARALLELISM)), + (InOutTuple x, InOutTuple y) -> x.add(y)) + .thenCombineAsync( + CompletableFuture + .supplyAsync(() -> getResultMonteCarloPiDraw( + TOTAL_CYCLES / PARALLELISM)), + (InOutTuple x, InOutTuple y) -> x.add(y)) + .thenCombineAsync( + CompletableFuture + .supplyAsync(() -> getResultMonteCarloPiDraw( + TOTAL_CYCLES / PARALLELISM)), + (InOutTuple x, InOutTuple y) -> x.add(y)) + .thenCombineAsync( + CompletableFuture + .supplyAsync(() -> getResultMonteCarloPiDraw( + TOTAL_CYCLES / PARALLELISM)), + (InOutTuple x, InOutTuple y) -> x.add(y)) + .thenCombineAsync( + CompletableFuture + .supplyAsync(() -> getResultMonteCarloPiDraw( + TOTAL_CYCLES / PARALLELISM)), + (InOutTuple x, InOutTuple y) -> x.add(y)) + .join(); + var time = System.currentTimeMillis() - now; + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi + ", " + time + " ms"); + } + +} diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiCF2.java b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiCF2.java new file mode 100644 index 0000000..05d0637 --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiCF2.java @@ -0,0 +1,60 @@ +package pp; + +import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ForkJoinPool; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Parallele Berechnung (im Common Pool über Completable Future) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiCF2 { + static final int TOTAL_CYCLES = 10000000; + static final int PARALLELISM = ForkJoinPool.commonPool().getParallelism(); + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + */ + public static void main(String... args) { + var now = System.currentTimeMillis(); + var resultStage = CompletableFuture.supplyAsync( + () -> getResultMonteCarloPiDraw(TOTAL_CYCLES / PARALLELISM)); + for (var i = 1; i < PARALLELISM; i++) { + resultStage = resultStage.thenCombineAsync( + CompletableFuture + .supplyAsync(() -> getResultMonteCarloPiDraw( + TOTAL_CYCLES / PARALLELISM)), + (InOutTuple x, InOutTuple y) -> x.add(y)); + } + var result = resultStage.join(); + var time = System.currentTimeMillis() - now; + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi + ", " + time + " ms"); + } + +} diff --git a/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiSeq.java b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiSeq.java new file mode 100644 index 0000000..2aeb5e3 --- /dev/null +++ b/src/pp.08.04-ConcurrencyMonteCarloPiCF_solution/src/main/java/pp/MonteCarloPiSeq.java @@ -0,0 +1,48 @@ +package pp; + +import java.util.Random; + +/** + * Berechnung von pi durch Monte Carlo Verfahren: Vergleich der Anzahl von + * zufällig gewähten Punkten innerhalb eines Viertelkreises (Radius r = 1) bzw. + * innerhalb eines Quadrates (Kantenlänge 1) analog zu Fläche eines + * Viertelkreises (pi * r^2 / 4) mit der Fläche des Quadrates (1 = 1 * 1). + * + * Sequenzielle Berechnung (im Main-Thread) + * + * @author Sandro Leuchter + * + */ +public class MonteCarloPiSeq { + static final int TOTAL_CYCLES = 10000000; + + public static InOutTuple getResultMonteCarloPiDraw(int cycles) { + var in = 0; + var out = 0; + var r = new Random(); + for (var i = 0; i < cycles; i++) { + var x = r.nextDouble(); + var y = r.nextDouble(); + if (Math.sqrt((x * x) + (y * y)) <= 1.0) { + in++; + } else { + out++; + } + } + return new InOutTuple(in, out); + } + + /** + * main-Methode + * + * @param args Kommandozeilenparameter (nicht benutzt) + */ + public static void main(String... args) { + var now = System.currentTimeMillis(); + var result = getResultMonteCarloPiDraw(TOTAL_CYCLES); + var time = System.currentTimeMillis() - now; + var pi = ((4.0 * result.in()) / (result.in() + result.out())); + System.out.println(pi + ", " + time + " ms"); + } + +}