Created
October 25, 2015 12:41
-
-
Save kodyzrodlowe/12a8e2427c2fb46d0e8c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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