diff --git a/README.md b/README.md index b0dfac3..967702f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,35 @@ # PP-2022WS-PF1 -Pflichtübung 1 von PP im WS 2022 \ No newline at end of file +Pflichtübung 1 von PP im WS 2022. + +Fällig: *Donnerstag, 27. Oktober 2022, 12:00* + +Bauen Sie die (synchronisierten) dinierenden Philosophen um, so dass Bedingungsvariablen benutzt werden: + +- Jeder Philosoph ist ein Thread und besitzt einen Warteraum, in dem die Nachbarphilosophen darauf warten, dass er seine + Stäbchen freigibt. +- Der Name der Klasse muss io.dama.ffi.parcoord.dining.cond.Philosopher sein. +- Philosoph implementiert das Interface io.dama.ffi.parcoord.dining.cond.IPhilosopher +- Jeder Philosoph hat je eine Referenz auf seinen linken und rechten Nachbarn. setLeft(IPhilosopher left); setRight( + IPhilosopher right); +- Der Tisch wird durch ein ReentrantLock-Objekt (Interface Lock) repräsentiert. Alle Philosophen müssen den Tisch + verwenden, wenn sie beginnen zu essen. Eine Referenz auf den Tisch kann mit dem Setter übergeben werden: setTable(Lock + table); +- Möchte ein Philosoph beginnen zu essen, prüft er, ob sein linker Nachbar oder sein rechter Nachbar isst; er erwartet + den Moment, in dem beide nicht essen. Dann beginnt er zu essen. +- Wenn ein Philosoph denkt, isst er nicht und signalisiert jeweils seinem linken Nachbarn und seinem rechten Nachbarn, + dass er nicht isst. + +Geben Sie eine Java-Datei (also nur den Quellcode) für die Klasse + + io.dama.ffi.parcoord.dining.cond.Philosopher + +ab. + +## Mitglieder: + +- Aya Bakkar +- Thomas Martin +- Eren Saglam +- Jonas Wächter +- Yan Wittmann \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4d7e998 --- /dev/null +++ b/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + pp + PP-2022WS-PF1 + 1.0-SNAPSHOT + + + 18 + 18 + + + \ No newline at end of file diff --git a/src/main/java/io/dama/ffi/parcoord/dining/cond/IPhilosopher.java b/src/main/java/io/dama/ffi/parcoord/dining/cond/IPhilosopher.java new file mode 100644 index 0000000..420b223 --- /dev/null +++ b/src/main/java/io/dama/ffi/parcoord/dining/cond/IPhilosopher.java @@ -0,0 +1,21 @@ +package io.dama.ffi.parcoord.dining.cond; + +import java.util.concurrent.locks.Lock; + +public interface IPhilosopher { + + void run(); + + void setLeft(IPhilosopher left); + + void setRight(IPhilosopher right); + + void setSeat(int seat); + + void setTable(Lock table); + + void start(); + + void stopPhilosopher(); + +} diff --git a/src/main/java/io/dama/ffi/parcoord/dining/cond/Philosopher.java b/src/main/java/io/dama/ffi/parcoord/dining/cond/Philosopher.java new file mode 100644 index 0000000..03801b8 --- /dev/null +++ b/src/main/java/io/dama/ffi/parcoord/dining/cond/Philosopher.java @@ -0,0 +1,36 @@ +package io.dama.ffi.parcoord.dining.cond; + +import java.util.concurrent.locks.Lock; + +public class Philosopher extends Thread implements IPhilosopher { + + @Override + public void setLeft(IPhilosopher left) { + // TODO Auto-generated method stub + // Cast auf Philosopher erforderlich + } + + @Override + public void setRight(IPhilosopher right) { + // TODO Auto-generated method stub + // Cast auf Philosopher erforderlich + } + + @Override + public void setSeat(int seat) { + // TODO Auto-generated method stub + + } + + @Override + public void setTable(Lock table) { + // TODO Auto-generated method stub + + } + + @Override + public void stopPhilosopher() { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/io/dama/ffi/parcoord/dining/cond/PhilosopherExperiment.java b/src/main/java/io/dama/ffi/parcoord/dining/cond/PhilosopherExperiment.java new file mode 100644 index 0000000..2cc1bdd --- /dev/null +++ b/src/main/java/io/dama/ffi/parcoord/dining/cond/PhilosopherExperiment.java @@ -0,0 +1,37 @@ +package io.dama.ffi.parcoord.dining.cond; + +import java.util.concurrent.locks.ReentrantLock; + +public class PhilosopherExperiment { + static final int MAX_THINKING_DURATION_MS = 3000; + static final int MAX_EATING_DURATION_MS = 3000; + static final int MAX_TAKING_TIME_MS = 100; + static final int PHILOSOPHER_NUM = 5; + static final int EXP_DURATION_MS = 20000; + static IPhilosopher[] philosophers = new Philosopher[PHILOSOPHER_NUM]; + + public static void main(String... args) throws InterruptedException { + var table = new ReentrantLock(); + for (var i = 0; i < PHILOSOPHER_NUM; i++) { + philosophers[i] = new Philosopher(); + philosophers[i].setTable(table); + philosophers[i].setSeat(i); + } + philosophers[0].setLeft(philosophers[PHILOSOPHER_NUM - 1]); + philosophers[0].setRight(philosophers[1]); + for (var i = 1; i < (PHILOSOPHER_NUM - 1); i++) { + philosophers[i].setLeft(philosophers[i - 1]); + philosophers[i].setRight(philosophers[i + 1]); + } + philosophers[PHILOSOPHER_NUM - 1] + .setLeft(philosophers[PHILOSOPHER_NUM - 2]); + philosophers[PHILOSOPHER_NUM - 1].setRight(philosophers[0]); + for (var i = 0; i < PHILOSOPHER_NUM; i++) { + philosophers[i].start(); + } + Thread.sleep(EXP_DURATION_MS); + for (var i = 0; i < PHILOSOPHER_NUM; i++) { + philosophers[i].stopPhilosopher(); + } + } +}