added ex T
This commit is contained in:
parent
c89a9b3a90
commit
28ab30e735
7
src/exercises/Utils.java
Normal file
7
src/exercises/Utils.java
Normal file
@ -0,0 +1,7 @@
|
||||
package exercises;
|
||||
|
||||
public class Utils {
|
||||
public static void randomSleep(long min, long max) throws InterruptedException {
|
||||
Thread.sleep((long) (min + Math.random() * max));
|
||||
}
|
||||
}
|
24
src/exercises/ex_t/BowlSemaphore.java
Normal file
24
src/exercises/ex_t/BowlSemaphore.java
Normal file
@ -0,0 +1,24 @@
|
||||
package exercises.ex_t;
|
||||
|
||||
import java.util.concurrent.Semaphore;
|
||||
|
||||
public class BowlSemaphore {
|
||||
private boolean isFull = false;
|
||||
private Semaphore semaphore = new Semaphore(1);
|
||||
|
||||
public boolean fill() throws InterruptedException {
|
||||
semaphore.acquire();
|
||||
boolean wasFull = isFull;
|
||||
isFull = true;
|
||||
semaphore.release();
|
||||
return wasFull;
|
||||
}
|
||||
|
||||
public boolean empty() throws InterruptedException {
|
||||
semaphore.acquire();
|
||||
boolean wasFull = isFull;
|
||||
isFull = false;
|
||||
semaphore.release();
|
||||
return wasFull;
|
||||
}
|
||||
}
|
29
src/exercises/ex_t/Dog.java
Normal file
29
src/exercises/ex_t/Dog.java
Normal file
@ -0,0 +1,29 @@
|
||||
package exercises.ex_t;
|
||||
|
||||
import exercises.Utils;
|
||||
|
||||
public class Dog implements Runnable {
|
||||
private final String name;
|
||||
private final BowlSemaphore[] bowls;
|
||||
|
||||
public Dog(String name, BowlSemaphore[] bowls) {
|
||||
this.name = name;
|
||||
this.bowls = bowls;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (true) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
BowlSemaphore bowl = bowls[i];
|
||||
try {
|
||||
if (bowl.empty()) {
|
||||
System.out.println(name + " ate from bowl " + i);
|
||||
Utils.randomSleep(10000, 20000);
|
||||
break;
|
||||
}
|
||||
} catch (InterruptedException _) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
28
src/exercises/ex_t/Feeder.java
Normal file
28
src/exercises/ex_t/Feeder.java
Normal file
@ -0,0 +1,28 @@
|
||||
package exercises.ex_t;
|
||||
|
||||
import exercises.Utils;
|
||||
|
||||
public class Feeder implements Runnable {
|
||||
private final String name;
|
||||
private final BowlSemaphore[] bowls;
|
||||
|
||||
public Feeder(String name, BowlSemaphore[] bowls) {
|
||||
this.name = name;
|
||||
this.bowls = bowls;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (true) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
BowlSemaphore bowl = bowls[i];
|
||||
try {
|
||||
if (!bowl.fill()) {
|
||||
System.out.println(name + " filled bowl " + i);
|
||||
Utils.randomSleep(1000, 3000);
|
||||
}
|
||||
} catch (InterruptedException _) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
16
src/exercises/ex_t/TestingSemaphore_DogBreeder.java
Normal file
16
src/exercises/ex_t/TestingSemaphore_DogBreeder.java
Normal file
@ -0,0 +1,16 @@
|
||||
package exercises.ex_t;
|
||||
|
||||
public class TestingSemaphore_DogBreeder {
|
||||
public static void main(String[] args) {
|
||||
BowlSemaphore[] bowlsSemaphores = new BowlSemaphore[3];
|
||||
for (int i = 0; i < 3; i++) {
|
||||
bowlsSemaphores[i] = new BowlSemaphore();
|
||||
}
|
||||
|
||||
new Thread(new Feeder("Marco", bowlsSemaphores)).start();
|
||||
new Thread(new Feeder("Luisa", bowlsSemaphores)).start();
|
||||
for (int i = 1; i < 10; i++) {
|
||||
new Thread(new Dog("Dog" + i, bowlsSemaphores)).start();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user