Utilisation des sémaphores
Rappel sur les Sémaphores
...
Sémaphore
public class Semaphore { private int cpt = 0; Semaphore (int c) { cpt = c; } public void P() throws InterruptedException { synchronized (this) { while (cpt == 0) { this.wait (); } cpt--; } } public void V() { synchronized (this) { cpt++; this.notify (); } } }
et c'est là l'essentiel du programme. La boucle while sert à la saisie du flux d'entrée .
........
Le dîner des philosohpes
// CS237 Concurrent Programming // ===== ========== =========== // First attempt at a solution to the dining philsopers problem. // The approach used is to represent each fork by a (binary) semaphore. // This version picks up both forks at once by putting the two actions // in a synchronized block. class philosopher extends Thread { static final Object lock = new Object() ; semaphore left, right ; int i ; public philosopher(int i, semaphore left, semaphore right) { this.i = i ; this.left = left ; this.right = right ; } // The next method is a random number generator. private int random(int n) { return (int) Math.round( n * Math.random() - 0.5 ) ; } // The next method is used to 'kill time' while a philosopher thinks or eats. private void busy(int i, String s) { System.out.println(i + " is " + s) ; try{ sleep(random(0)) ; } catch (InterruptedException e) { } } public void run() { do { busy(i, "thinking") ; synchronized (lock) { left.P() ; System.out.println(i + " gets left fork") ; right.P() ; System.out.println(i + " gets right fork") ; busy(i, "eating") ; } left.V() ; System.out.println(i + " releases left fork") ; right.V() ; System.out.println(i + " releases right fork") ; } while (true) ; } } class dpp3 { static int N = 5 ; static semaphore fork[] = new semaphore[N] ; static philosopher p[] = new philosopher[N] ; public static void main(String [] args) { for(int i=0; i<N; i++) fork[i] = new semaphore(1) ; for(int i=0; i<N; i++) { p[i] = new philosopher(i, fork[i], fork[(i+1) % N]) ; p[i].start() ; } } }