/** * 排他制御を行うプログラム * 引数 -d を付けて実行すると Dekker のアルゴリズムに、 * 引数 -p を付けて実行すると Peterson のアルゴリズムに、 * 引数 -l を付けて実行すると Lamport のアルゴリズムに、 * それ以外は交互実行のアルゴリズムになる * $ java Mutex → 交互実行アルゴリズム (2スレッド) * $ java Mutex -d → Dekker のアルゴリズム (2スレッド) * $ java Mutex -p → Peterson のアルゴリズム(2スレッド) * $ java Mutex -l → Lamport のアルゴリズム (4スレッド) */ class Mutex { public static void main (String[] args) { int threadNum = 2; // 実行するスレッド数 int algorithmNum = 0; // 実行するアルゴリズムの番号 /* 0: 交互実行アルゴリズム * 1: Dekker のアルゴリズム * 2: Peterson のアルゴリズム * 3: Lamport のアルゴリズム */ /* オプションの確認 * -d: Dekker のアルゴリズム * -p: Peterson のアルゴリズム * -l: Lamport のアルゴリズム * それ以外: 交互実行アルゴリズム */ if (args.length >= 1) { if (args[0].equals("-d")) algorithmNum = 1; else if (args[0].equals("-p")) algorithmNum = 2; else if (args[0].equals("-l")) { algorithmNum = 3; threadNum = 4; } } MutualExclusion.setParameter (threadNum, algorithmNum); /* スレッドを生成する */ Thread th[] = new Thread[threadNum]; th[0] = new MutualExclusion(0, 2000L, 2000L); /* 臨界領域2秒, 非臨界領域2秒を繰り返すスレッド */ th[1] = new MutualExclusion(1, 1000L, 7000L); /* 臨界領域1秒, 非臨界領域7秒を繰り返すスレッド */ if (algorithmNum == 3) { th[2] = new MutualExclusion(2, 1000L, 3000L); /* 臨界領域1秒, 非臨界領域3秒を繰り返すスレッド */ th[3] = new MutualExclusion(3, 3000L, 5000L); /* 臨界領域3秒, 非臨界領域5秒を繰り返すスレッド */ } /* 排他制御アルゴリズムの実行開始 */ switch (algorithmNum) { case 0: System.out.println ("交互実行アルゴリズム開始"); break; case 1: System.out.println ("Dekker のアルゴリズム開始"); break; case 2: System.out.println ("Peterson のアルゴリズム開始"); break; case 3: System.out.println ("Lamport のアルゴリズム開始"); break; } for (int i=0; i