/** * セマフォを用いた食事をする哲学者問題を実行するプログラム * 引数 1 を付けて実行すると 解法1 :「繋がったフォーク」に、 * 引数 2 を付けて実行すると 解法2 :「左利きの哲学者」に、 * 引数 3 を付けて実行すると 解法3 :「我慢する哲学者」に、 * それ以外は「デッドロックに無策な哲学者」になる * $ java DiningPhilosophers → デッドロックに無策な哲学者 * $ java DiningPhilosophers 1 → 繋がったフォーク * $ java DiningPhilosophers 2 → 左利きの哲学者 * $ java DiningPhilosophers 3 → 我慢する哲学者 */ import java.util.concurrent.Semaphore; import java.util.Random; /** * セマフォを用いた食事をする哲学者問題実行クラスの * インスタンスを生成し実行するクラス * Phlosophers クラスのインスタンスを5つ作り実行する */ public class DiningPhilosophers { public static void main(String[] args) { int numOfPhilosophers = 5; // 哲学者の人数 /* オプションの確認 * 1: 繋がったフォーク * 2: 左利きの哲学者 * 3: 我慢する哲学者 * それ以外: デッドロックに無策な哲学者 */ int philosopherType = 0; if (args.length >= 1) { if (args[0].equals("1")) philosopherType = 1; else if (args[0].equals("2")) philosopherType = 2; else if (args[0].equals("3")) philosopherType = 3; } /* 哲学者のタイプを設定 */ Philosophers.setPhilosopherType (philosopherType); /* セマフォを生成する */ Philosophers.newSemaphore (numOfPhilosophers); /* スレッドを生成する */ Thread ph[] = new Thread[numOfPhilosophers]; for (int i=0; i