diff --git a/src/pp.04.01-RunnableReturn/justfile b/src/pp.04.01-RunnableReturn/justfile new file mode 100644 index 0000000..848084f --- /dev/null +++ b/src/pp.04.01-RunnableReturn/justfile @@ -0,0 +1,12 @@ +default: + mvn clean compile exec:java +exec args: + mvn exec:java -Dexec.args={{args}} +clean: + mvn clean +compile: + mvn compile +test: + mvn test +javadoc: + mvn javadoc:javadoc diff --git a/src/pp.04.01-RunnableReturn/pom.xml b/src/pp.04.01-RunnableReturn/pom.xml new file mode 100644 index 0000000..2a010e3 --- /dev/null +++ b/src/pp.04.01-RunnableReturn/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + pp + pp.04.01-RunnableReturn + 1.0-SNAPSHOT + jar + + + pp.Main + 10 + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + 1.18.30 + 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.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.04.01-RunnableReturn/src/main/java/pp/Expression.java b/src/pp.04.01-RunnableReturn/src/main/java/pp/Expression.java new file mode 100644 index 0000000..7cf3de2 --- /dev/null +++ b/src/pp.04.01-RunnableReturn/src/main/java/pp/Expression.java @@ -0,0 +1,6 @@ +package pp; + +@FunctionalInterface +public interface Expression { + public T eval(); +} diff --git a/src/pp.04.01-RunnableReturn/src/main/java/pp/Main.java b/src/pp.04.01-RunnableReturn/src/main/java/pp/Main.java new file mode 100644 index 0000000..c2873f8 --- /dev/null +++ b/src/pp.04.01-RunnableReturn/src/main/java/pp/Main.java @@ -0,0 +1,9 @@ +package pp; + +public class Main { + + public static void main(String... args) throws InterruptedException { + // hier programmieren + } + +} diff --git a/src/pp.04.01-RunnableReturn/src/main/java/pp/RunnableWithResult.java b/src/pp.04.01-RunnableReturn/src/main/java/pp/RunnableWithResult.java new file mode 100644 index 0000000..ec4d5d1 --- /dev/null +++ b/src/pp.04.01-RunnableReturn/src/main/java/pp/RunnableWithResult.java @@ -0,0 +1,28 @@ +package pp; + +public class RunnableWithResult implements Runnable { + private final Expression expr; + + public RunnableWithResult(Expression expr) { + this.expr = expr; + } + + @Override + public void run() { + // hier programmieren + } + + public synchronized Boolean isAvailable() { + // hier programmieren + return null; + } + + public synchronized T get() { + // hier programmieren + return null; + } + + public Expression expr() { + return expr; + } +} diff --git a/src/pp.04.01-RunnableReturn_solution/justfile b/src/pp.04.01-RunnableReturn_solution/justfile new file mode 100644 index 0000000..848084f --- /dev/null +++ b/src/pp.04.01-RunnableReturn_solution/justfile @@ -0,0 +1,12 @@ +default: + mvn clean compile exec:java +exec args: + mvn exec:java -Dexec.args={{args}} +clean: + mvn clean +compile: + mvn compile +test: + mvn test +javadoc: + mvn javadoc:javadoc diff --git a/src/pp.04.01-RunnableReturn_solution/pom.xml b/src/pp.04.01-RunnableReturn_solution/pom.xml new file mode 100644 index 0000000..267481c --- /dev/null +++ b/src/pp.04.01-RunnableReturn_solution/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + pp + pp.04.01-RunnableReturn_solution + 1.0-SNAPSHOT + jar + + + pp.Main + 10 + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + 1.18.30 + 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.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.04.01-RunnableReturn_solution/src/main/java/pp/Expression.java b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/Expression.java new file mode 100644 index 0000000..7cf3de2 --- /dev/null +++ b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/Expression.java @@ -0,0 +1,6 @@ +package pp; + +@FunctionalInterface +public interface Expression { + public T eval(); +} diff --git a/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/Main.java b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/Main.java new file mode 100644 index 0000000..24432cb --- /dev/null +++ b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/Main.java @@ -0,0 +1,35 @@ +package pp; + +public class Main { + + public static void main(String... args) throws InterruptedException { + var r1 = new RunnableWithResult2<>(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + return 1 + 2; + }); + var r2 = new RunnableWithResult2<>(() -> 3 + 4); + var r3 = new RunnableWithResult2<>(() -> { + while (!r1.isAvailable() || !r2.isAvailable()) { + System.out.println("waiting on r1 or r2"); + } + return r1.get() + r2.get(); + }); + + var thread1 = new Thread(r1); + var thread2 = new Thread(r2); + var thread3 = new Thread(r3); + + thread1.start(); + thread2.start(); + thread3.start(); + + while (!r3.isAvailable()) { + System.out.println("waiting on r3"); + } + System.out.println("result: " + r3.get()); + } +} diff --git a/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult.java b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult.java new file mode 100644 index 0000000..ec4d5d1 --- /dev/null +++ b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult.java @@ -0,0 +1,28 @@ +package pp; + +public class RunnableWithResult implements Runnable { + private final Expression expr; + + public RunnableWithResult(Expression expr) { + this.expr = expr; + } + + @Override + public void run() { + // hier programmieren + } + + public synchronized Boolean isAvailable() { + // hier programmieren + return null; + } + + public synchronized T get() { + // hier programmieren + return null; + } + + public Expression expr() { + return expr; + } +} diff --git a/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult1.java b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult1.java new file mode 100644 index 0000000..61ced1e --- /dev/null +++ b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult1.java @@ -0,0 +1,31 @@ +package pp; + +public class RunnableWithResult1 extends RunnableWithResult { + private T result; + private boolean finished; + + public RunnableWithResult1(Expression expr) { + super(expr); + } + + @Override + public void run() { + synchronized (this) { // Memorybarrier + this.finished = false; + } + this.result = expr().eval(); + synchronized (this) { + this.finished = true; + } // Memorybarrier + } + + @Override + public synchronized Boolean isAvailable() { + return this.finished; + } + + @Override + public synchronized T get() { + return this.result; + } +} diff --git a/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult2.java b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult2.java new file mode 100644 index 0000000..32d4190 --- /dev/null +++ b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult2.java @@ -0,0 +1,26 @@ +package pp; + +public class RunnableWithResult2 extends RunnableWithResult { + private T result; + private volatile Thread self; + + public RunnableWithResult2(Expression expr) { + super(expr); + } + + @Override + public void run() { + this.self = Thread.currentThread(); + this.result = expr().eval(); + } + + @Override + public synchronized Boolean isAvailable() { + return (this.self != null) && !this.self.isAlive(); + } + + @Override + public synchronized T get() { + return this.result; + } +} diff --git a/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult3.java b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult3.java new file mode 100644 index 0000000..ebb440b --- /dev/null +++ b/src/pp.04.01-RunnableReturn_solution/src/main/java/pp/RunnableWithResult3.java @@ -0,0 +1,27 @@ +package pp; + +public class RunnableWithResult3 extends RunnableWithResult { + private T result; + private Thread executor; + + public RunnableWithResult3(Expression expr) { + super(expr); + this.executor = new Thread(this); + this.executor.start(); + } + + @Override + public void run() { + this.result = expr().eval(); + } + + @Override + public synchronized Boolean isAvailable() { + return (this.executor != null) && !this.executor.isAlive(); + } + + @Override + public synchronized T get() { + return this.result; + } +} diff --git a/src/pp.04.02-Future/justfile b/src/pp.04.02-Future/justfile new file mode 100644 index 0000000..848084f --- /dev/null +++ b/src/pp.04.02-Future/justfile @@ -0,0 +1,12 @@ +default: + mvn clean compile exec:java +exec args: + mvn exec:java -Dexec.args={{args}} +clean: + mvn clean +compile: + mvn compile +test: + mvn test +javadoc: + mvn javadoc:javadoc diff --git a/src/pp.04.02-Future/pom.xml b/src/pp.04.02-Future/pom.xml new file mode 100644 index 0000000..a390e40 --- /dev/null +++ b/src/pp.04.02-Future/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + pp + pp.04.02-Future + 1.0-SNAPSHOT + jar + + + pp.Main + 10 + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + 1.18.30 + 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.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.04.02-Future/src/main/java/pp/Main.java b/src/pp.04.02-Future/src/main/java/pp/Main.java new file mode 100644 index 0000000..429e70b --- /dev/null +++ b/src/pp.04.02-Future/src/main/java/pp/Main.java @@ -0,0 +1,13 @@ +package pp; + +import java.util.concurrent.Executors; + +public class Main { + + public static void main(String... args) { + var executor = Executors.newCachedThreadPool(); + // hier programmieren + executor.shutdown(); + } + +} diff --git a/src/pp.04.02-Future_solution/justfile b/src/pp.04.02-Future_solution/justfile new file mode 100644 index 0000000..848084f --- /dev/null +++ b/src/pp.04.02-Future_solution/justfile @@ -0,0 +1,12 @@ +default: + mvn clean compile exec:java +exec args: + mvn exec:java -Dexec.args={{args}} +clean: + mvn clean +compile: + mvn compile +test: + mvn test +javadoc: + mvn javadoc:javadoc diff --git a/src/pp.04.02-Future_solution/pom.xml b/src/pp.04.02-Future_solution/pom.xml new file mode 100644 index 0000000..1839240 --- /dev/null +++ b/src/pp.04.02-Future_solution/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + pp + pp.04.02-Future_solution + 1.0-SNAPSHOT + jar + + + pp.Main + 10 + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + 1.18.30 + 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.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.04.02-Future_solution/src/main/java/pp/Main.java b/src/pp.04.02-Future_solution/src/main/java/pp/Main.java new file mode 100644 index 0000000..2174492 --- /dev/null +++ b/src/pp.04.02-Future_solution/src/main/java/pp/Main.java @@ -0,0 +1,34 @@ +package pp; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; + +public class Main { + + public static void main(String... args) { + var executor = Executors.newCachedThreadPool(); + // Lambda-Ausdruck, mehrere Statements, explizites return + var f1 = executor.submit(() -> { + return 1.0 + 2.0; + }); + // Callable als Inner Class + var f2 = executor.submit(new Callable() { + @Override + public Double call() throws Exception { + return 3.0 + 4.0; + } + }); + // Lambda-Ausdruck, knapp + var f3 = executor.submit(() -> f1.get() + f2.get()); + try { + // get() blockiert, bis etwas vorliegt (auch oben) + System.out.println(f3.get()); + } catch (InterruptedException | ExecutionException e) { + // Exceptions in f1 und f2 werden bis zum f3.get() verzögert + Thread.currentThread().interrupt(); + } finally { + executor.shutdown(); + } + } +} diff --git a/src/pp.04.03-ThreadPoolSize/justfile b/src/pp.04.03-ThreadPoolSize/justfile new file mode 100644 index 0000000..848084f --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize/justfile @@ -0,0 +1,12 @@ +default: + mvn clean compile exec:java +exec args: + mvn exec:java -Dexec.args={{args}} +clean: + mvn clean +compile: + mvn compile +test: + mvn test +javadoc: + mvn javadoc:javadoc diff --git a/src/pp.04.03-ThreadPoolSize/pom.xml b/src/pp.04.03-ThreadPoolSize/pom.xml new file mode 100644 index 0000000..56792dd --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + pp + pp.04.03-ThreadPoolSize + 1.0-SNAPSHOT + jar + + + pp.Task + 10 + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + 1.18.30 + 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.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.04.03-ThreadPoolSize/src/main/java/pp/CachedRunner.java b/src/pp.04.03-ThreadPoolSize/src/main/java/pp/CachedRunner.java new file mode 100644 index 0000000..ee3b654 --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize/src/main/java/pp/CachedRunner.java @@ -0,0 +1,16 @@ +package pp; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class CachedRunner { + + public static ExecutorService test(Runnable task, int tries) { + var pool = Executors.newCachedThreadPool(); + for (var i = 1; i <= tries; i++) { + pool.execute(task); + } + return pool; + } + +} diff --git a/src/pp.04.03-ThreadPoolSize/src/main/java/pp/FixedRunner.java b/src/pp.04.03-ThreadPoolSize/src/main/java/pp/FixedRunner.java new file mode 100644 index 0000000..ed47c09 --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize/src/main/java/pp/FixedRunner.java @@ -0,0 +1,17 @@ +package pp; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class FixedRunner { + private final static int SIZE = 6; + + public static ExecutorService test(Runnable task, int tries) { + var pool = Executors.newFixedThreadPool(SIZE); + for (var i = 1; i <= tries; i++) { + pool.execute(task); + } + return pool; + } + +} diff --git a/src/pp.04.03-ThreadPoolSize/src/main/java/pp/Task.java b/src/pp.04.03-ThreadPoolSize/src/main/java/pp/Task.java new file mode 100644 index 0000000..132370a --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize/src/main/java/pp/Task.java @@ -0,0 +1,17 @@ +package pp; + +public class Task implements Runnable { + + private static final int NUMBER_OF_TASKS = 1; + + @Override + public void run() { + // TODO + } + + public static void main(String... args) { + // var pool = CachedRunner.test(new Task(), NUMBER_OF_TASKS); + var pool = FixedRunner.test(new Task(), NUMBER_OF_TASKS); + } + +} diff --git a/src/pp.04.03-ThreadPoolSize_solution/justfile b/src/pp.04.03-ThreadPoolSize_solution/justfile new file mode 100644 index 0000000..edbee11 --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize_solution/justfile @@ -0,0 +1,20 @@ +default: + mvn clean compile exec:java + +innerClass: (_exec "pp.TaskInnerClass" "") +lambda: (_exec "pp.TaskLambda" "") +staticClass: (_exec "pp.TaskStaticClass" "") + +_exec class args: + mvn exec:java -Dexec.mainClass={{class}} -Dexec.args={{args}} + +exec args: + mvn exec:java -Dexec.args={{args}} +clean: + mvn clean +compile: + mvn compile +test: + mvn test +javadoc: + mvn javadoc:javadoc diff --git a/src/pp.04.03-ThreadPoolSize_solution/pom.xml b/src/pp.04.03-ThreadPoolSize_solution/pom.xml new file mode 100644 index 0000000..a89caae --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize_solution/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + pp + pp.04.03-ThreadPoolSize_solution + 1.0-SNAPSHOT + jar + + + pp.TaskLambda + 10 + UTF-8 + + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.projectlombok + lombok + 1.18.30 + 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.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.04.03-ThreadPoolSize_solution/src/main/java/pp/CachedRunner.java b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/CachedRunner.java new file mode 100644 index 0000000..ee3b654 --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/CachedRunner.java @@ -0,0 +1,16 @@ +package pp; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class CachedRunner { + + public static ExecutorService test(Runnable task, int tries) { + var pool = Executors.newCachedThreadPool(); + for (var i = 1; i <= tries; i++) { + pool.execute(task); + } + return pool; + } + +} diff --git a/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/FixedRunner.java b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/FixedRunner.java new file mode 100644 index 0000000..ed47c09 --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/FixedRunner.java @@ -0,0 +1,17 @@ +package pp; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class FixedRunner { + private final static int SIZE = 6; + + public static ExecutorService test(Runnable task, int tries) { + var pool = Executors.newFixedThreadPool(SIZE); + for (var i = 1; i <= tries; i++) { + pool.execute(task); + } + return pool; + } + +} diff --git a/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskInnerClass.java b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskInnerClass.java new file mode 100644 index 0000000..3575380 --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskInnerClass.java @@ -0,0 +1,34 @@ +package pp; + +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class TaskInnerClass { + + private static final int NUMBER_OF_TASKS = 20; + + public static void main(String... args) { + var pool1 = FixedRunner.test(new Runnable() { + @Override + public void run() { + System.out.println(Thread.currentThread().getName()); + } + }, NUMBER_OF_TASKS); + var pool2 = CachedRunner.test(new Runnable() { + @Override + public void run() { + System.out.println(Thread.currentThread().getName()); + } + }, NUMBER_OF_TASKS); + var scheduler = Executors.newSingleThreadScheduledExecutor(); + scheduler.schedule(new Runnable() { + @Override + public void run() { + pool1.shutdown(); + pool2.shutdown(); + scheduler.shutdown(); + } + }, 5, TimeUnit.SECONDS); + } + +} diff --git a/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskLambda.java b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskLambda.java new file mode 100644 index 0000000..8420014 --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskLambda.java @@ -0,0 +1,24 @@ +package pp; + +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class TaskLambda { + + private static final int NUMBER_OF_TASKS = 20; + + public static void main(String... args) { + var pool1 = FixedRunner.test( + () -> System.out.println(Thread.currentThread().getName()), + NUMBER_OF_TASKS); + var pool2 = CachedRunner.test( + () -> System.out.println(Thread.currentThread().getName()), + NUMBER_OF_TASKS); + var scheduler = Executors.newSingleThreadScheduledExecutor(); + scheduler.schedule(() -> { + pool1.shutdown(); + pool2.shutdown(); + scheduler.shutdown(); + }, 5, TimeUnit.SECONDS); + } +} diff --git a/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskStaticClass.java b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskStaticClass.java new file mode 100644 index 0000000..3423b7a --- /dev/null +++ b/src/pp.04.03-ThreadPoolSize_solution/src/main/java/pp/TaskStaticClass.java @@ -0,0 +1,37 @@ +package pp; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class TaskStaticClass implements Runnable { + static class Shutdowner implements Runnable { + @Override + public void run() { + pool1.shutdown(); + pool2.shutdown(); + scheduler.shutdown(); + } + } + + private static final int NUMBER_OF_TASKS = 20; + private static ExecutorService pool1; + private static ExecutorService pool2; + private static ScheduledExecutorService scheduler; + + @Override + public void run() { + System.out.println(Thread.currentThread().getName()); + } + + public static void main(String... args) { + pool1 = FixedRunner.test(new TaskStaticClass(), + NUMBER_OF_TASKS); + pool2 = CachedRunner.test(new TaskStaticClass(), + NUMBER_OF_TASKS); + scheduler = Executors.newSingleThreadScheduledExecutor(); + scheduler.schedule(new Shutdowner(), 5, TimeUnit.SECONDS); + } + +}