Want more features on Pastebin? Sign Up, it's FREE!
Guest

[TIJ4] [with bin] Dining Philisophers problem

By: a guest on Dec 8th, 2012  |  syntax: Java  |  size: 3.11 KB  |  views: 52  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. //: concurrency/DeadlockingDiningPhilosophers.java
  2. package concurrency;
  3.  
  4. import java.util.concurrent.*;
  5.  
  6. public class DeadlockingDiningPhilosophers {
  7.   public static void main(String[] args) throws Exception {
  8.     int ponder = 5;
  9.     if(args.length > 0)
  10.       ponder = Integer.parseInt(args[0]);
  11.     int size = 5;
  12.     if(args.length > 1)
  13.       size = Integer.parseInt(args[1]);
  14.     ExecutorService exec = Executors.newCachedThreadPool();
  15.     Chopstick[] sticks = new Chopstick[size];
  16.     LinkedBlockingQueue<Chopstick> bin = new LinkedBlockingQueue<Chopstick>();
  17.     for(int i = 0; i < size; i++)
  18.       sticks[i] = new Chopstick();
  19.     for(int i = 0; i < size; i++)
  20.         exec.execute(new Philosopher(
  21.           sticks[i], sticks[(i+1) % size], bin, i, ponder));
  22.     if(args.length == 3 && args[2].equals("timeout"))
  23.       TimeUnit.SECONDS.sleep(5);
  24.     else {
  25.       System.out.println("Press 'Enter' to quit");
  26.       System.in.read();
  27.     }
  28.     exec.shutdownNow();
  29.   }
  30. }
  31.  
  32. //: concurrency/Philosopher.java
  33. // A dining philosopher
  34. package concurrency;
  35.  
  36. import java.util.concurrent.*;
  37. import java.util.*;
  38. import static util.Print.*;
  39.  
  40. public class Philosopher implements Runnable {
  41.         private BlockingQueue<Chopstick> bin;
  42.   private Chopstick left;
  43.   private Chopstick right;
  44.   private final int id;
  45.   private final int ponderFactor;
  46.   private Random rand = new Random(47);
  47.   private void pause() throws InterruptedException {
  48.     if(ponderFactor == 0) return;
  49.     TimeUnit.MILLISECONDS.sleep(
  50.       rand.nextInt(ponderFactor * 250));
  51.   }
  52.   public Philosopher(Chopstick left, Chopstick right, BlockingQueue<Chopstick> bin,
  53.     int ident, int ponder) {
  54.     this.left = left;
  55.     this.right = right;
  56.         this.bin = bin;
  57.     id = ident;
  58.     ponderFactor = ponder;
  59.   }
  60.   public void run() {
  61.     try {
  62.         print(this + " " + "thinking");
  63.         pause();
  64.         // Philosopher becomes hungry
  65.         print(this + " " + "grabbing right");
  66.         right.take();
  67.         print(this + " " + "grabbing left");
  68.         left.take();
  69.         print(this + " " + "eating");
  70.         pause();
  71.         right.drop();
  72.         left.drop();
  73.                 print("putting left to bin."); bin.put(left);
  74.                 while(!Thread.interrupted()) {
  75.                         print(this + " " + "thinking");
  76.                         pause();
  77.                         // Philosopher becomes hungry
  78.                         print(this + " " + "grabbing right from bin");
  79.                         right = bin.take();
  80.                         print(this + " " + "grabbing left from bin");
  81.                         left = bin.take();
  82.                         print(this + " " + "eating");
  83.                         pause();
  84.                         print(this + " " + "putting right to bin "); bin.put(right);
  85.                         print(this + " " + "putting left to bin "); bin.put(left);
  86.                 }
  87.     } catch(InterruptedException e) {
  88.       print(this + " " + "exiting via interrupt");
  89.     }
  90.   }
  91.   public String toString() { return "Philosopher " + id; }
  92. } ///:~
  93.  
  94. //: concurrency/Chopstick.java
  95. package concurrency;
  96.  
  97. public class Chopstick {
  98.   private boolean taken = false;
  99.   public synchronized
  100.   void take() throws InterruptedException {
  101.     while(taken)
  102.       wait();
  103.     taken = true;
  104.   }
  105.   public synchronized void drop() {
  106.     taken = false;
  107.     notifyAll();
  108.   }
  109. } ///:~
clone this paste RAW Paste Data