Skip to content

Instantly share code, notes, and snippets.

@kodyzrodlowe
Created October 25, 2015 12:41
Show Gist options
  • Save kodyzrodlowe/12a8e2427c2fb46d0e8c to your computer and use it in GitHub Desktop.
Save kodyzrodlowe/12a8e2427c2fb46d0e8c to your computer and use it in GitHub Desktop.
package philosopher;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class Chopstick {
private boolean taken = false; //znacznik zajętości pałeczki
public synchronized void take() throws InterruptedException { //filozof chce wziac paleczke
while(taken) wait(); //ale musi czekac az bedzie wolna
taken = true;
}
public synchronized void drop() { //filozof odstawia pałeczke
taken = false;
notifyAll(); //wywołanie oczekujących na pałeczkę filozofów
}
}
class Philosopher implements Runnable {
private Chopstick left; //lewa pałezcka
private Chopstick right; //prawa pałeczka
private final int id; //identyfikator filozofa
private final int ponderFactor; //znacznik rozmyślania filozofa
private Random rand = new Random(47); //klasa losująca czas rozmyslania filozofa
private void pause() throws InterruptedException { //czas rozmyslania filozofa
if (ponderFactor == 0) return;
TimeUnit.MILLISECONDS.sleep(rand.nextInt(ponderFactor * 250));
}
public Philosopher(Chopstick left, Chopstick right, int ident, int ponder) { //konstruktor filozofa
this.left = left; //przekazanie lewej pałeczki
this.right = right; //przekazanie prawej pałeczki
id = ident; //ustawienie identyfikatora filozofa
ponderFactor = ponder; //ustawienie czasu rozmyślania filozofa
}
public void run() {
try {
while(!Thread.interrupted()) {
System.out.println(this + " " + "rozmysla");
pause(); //rozmyślanie filozofa
System.out.println(this + " " + "chwyta prawą pałeczkę");
right.take(); //pobranie prawej pałeczki
System.out.println(this + " " + "chwyta lewa pałeczkę");
left.take(); //pobranie lewej pałeczki
System.out.println(this + " " + "ucztuje");
pause(); //filozof ucztuje
right.drop(); //oddanie prawej pałeczki
left.drop(); //oddanie lewej pałeczki
}
} catch (InterruptedException e) {
System.out.println(this + " " + "wyjscie wymuszone przerwaniem");
}
}
public String toString() {
return "Filozof " + id;
}
}
class DiningPhilosopher {
private static int size;
public static void main(String[] args) throws Exception {
int ponder = 5; //ilosc czasu spedzanego przez filozofa na rozmyslaniu
size = 5; //ilosc filozofów
ExecutorService exec = Executors.newCachedThreadPool(); //wykonawca z pulą dynamiczną
Chopstick[] sticks = new Chopstick[size]; //deklaracja tablicy pałeczek
for (int i = 0; i < size; i++) {
sticks[i] = new Chopstick(); //inicjacja tablicy z pałeczkami
}
for (int i = 0; i < size; i++) {
if ( i < (size) - 1 ) {
//zapobieganie zakleszczeniu w ten sposób że ostatni filozof zdobywa najpierw lewa a potem prawą pałeczke
//przez co uniemożliwi jego sąsiadowi z prawej zdobycia jego kompletu pałeczek
exec.execute(new Philosopher(sticks[i], sticks[i+1], i, ponder));
} else {
exec.execute(new Philosopher(sticks[0], sticks[i], i, ponder));
}
}
TimeUnit.SECONDS.sleep(5);
System.out.println("Aby zakonczyc nacisnij ENTER");
System.in.read();
exec.shutdownNow();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment