DiningPhilo
This commit is contained in:
parent
34392785c5
commit
7feec0d3cd
30
src/praktikum04/BetterPhilosopher.java
Normal file
30
src/praktikum04/BetterPhilosopher.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package praktikum04;
|
||||||
|
|
||||||
|
public class BetterPhilosopher extends Philosopher{
|
||||||
|
|
||||||
|
public BetterPhilosopher(int id, Fork left, Fork right) {
|
||||||
|
super(id, left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void allocateForks() {
|
||||||
|
Fork fork1 = left;
|
||||||
|
Fork fork2 = right;
|
||||||
|
|
||||||
|
if(left.getId() > right.getId()) {
|
||||||
|
fork1 = right;
|
||||||
|
fork2 = left;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("Philosopher" + id + "is trying to get a fork" + fork1.getId());
|
||||||
|
while(!fork1.take())
|
||||||
|
Thread.yield();
|
||||||
|
System.out.println("Philosopher" + id + "got a fork" + fork1.getId());
|
||||||
|
|
||||||
|
System.out.println("Philosopher" + id + "is trying to get a fork" + fork2.getId());
|
||||||
|
while(!fork2.take())
|
||||||
|
Thread.yield();
|
||||||
|
System.out.println("Philosopher" + id + "got a fork" + fork2.getId());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
41
src/praktikum04/Fork.java
Normal file
41
src/praktikum04/Fork.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package praktikum04;
|
||||||
|
|
||||||
|
public class Fork {
|
||||||
|
|
||||||
|
|
||||||
|
private boolean inUse = false;
|
||||||
|
private final int id;
|
||||||
|
|
||||||
|
public Fork(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
|
||||||
|
return id;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean take() {
|
||||||
|
synchronized (this) {
|
||||||
|
if(inUse) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
inUse = true;
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
System.out.println("Gabel" + id + "konnte nicht angenommen werden");
|
||||||
|
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void put() {
|
||||||
|
synchronized (this) {
|
||||||
|
inUse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
47
src/praktikum04/Philosopher.java
Normal file
47
src/praktikum04/Philosopher.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package praktikum04;
|
||||||
|
|
||||||
|
import java.awt.desktop.AppHiddenListener;
|
||||||
|
|
||||||
|
public class Philosopher implements Runnable{
|
||||||
|
|
||||||
|
protected int id ;
|
||||||
|
protected final Fork left;
|
||||||
|
|
||||||
|
protected final Fork right;
|
||||||
|
|
||||||
|
public Philosopher(int id, Fork left, Fork right) {
|
||||||
|
this.id = id;
|
||||||
|
this.left = left;
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
allocateForks();
|
||||||
|
System.out.println("Philosopher " + id + " is eating");
|
||||||
|
|
||||||
|
try {
|
||||||
|
Thread.sleep(2000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
System.out.println("Philosopher" + id + "was interrupted");
|
||||||
|
}
|
||||||
|
left.put();
|
||||||
|
right.put();
|
||||||
|
|
||||||
|
System.out.println("Philosopher" + id + "is done eating");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void allocateForks() {
|
||||||
|
System.out.println("Philosopher" + id + "is trying to get a fork." + left.getId());
|
||||||
|
while (!left.take())
|
||||||
|
Thread.yield();
|
||||||
|
System.out.println("Philosopher" + id + "got fork" + left.getId());
|
||||||
|
System.out.println("Philosopher" + id + "is trying to get a fork" + right.getId());
|
||||||
|
while (!right.take())
|
||||||
|
Thread.yield();
|
||||||
|
System.out.println("Philosopher" + id + "got fork" + right.getId());
|
||||||
|
}
|
||||||
|
}
|
20
src/praktikum04/Table.java
Normal file
20
src/praktikum04/Table.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package praktikum04;
|
||||||
|
|
||||||
|
public class Table {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Fork[] forks = { new Fork(0), new Fork(1), new Fork(2),
|
||||||
|
new Fork(3), new Fork(4)};
|
||||||
|
Philosopher[] philosophers = {
|
||||||
|
new Philosopher(0, forks[0], forks[1]),
|
||||||
|
new Philosopher(1, forks[1], forks[2]),
|
||||||
|
new Philosopher(2, forks[2], forks[3]),
|
||||||
|
new Philosopher(3, forks[3], forks[4]),
|
||||||
|
new Philosopher(4, forks[4], forks[0])
|
||||||
|
};
|
||||||
|
for (Philosopher philosopher : philosophers) {
|
||||||
|
Thread t = new Thread(philosopher);
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
32
test/praktikum04/ForkTest.java
Normal file
32
test/praktikum04/ForkTest.java
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package praktikum04;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
class ForkTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getId() {
|
||||||
|
|
||||||
|
Fork fork = new Fork(1);
|
||||||
|
fork.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void take() {
|
||||||
|
|
||||||
|
Fork fork = new Fork(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void put() {
|
||||||
|
|
||||||
|
Fork fork = new Fork(1);
|
||||||
|
fork.take();
|
||||||
|
|
||||||
|
fork.put();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user