/** * 相互排除アルゴリズム実行クラス * 実行できる相互排除アルゴリズムは以下の4種類 * 0. 交互実行アルゴリズム * 1. Dekker のアルゴリズム * 2. Peterson のアルゴリズム * 3. Lamport のアルゴリズム */ class MutualExclusion extends Thread { int threadID; // スレッド番号 long latencyCS; // 臨界領域の中にいる時間 long latencyNCS; // 非臨界領域の中にいる時間 String spc = ""; // 行頭表示用空白 static int threadNum = 2; // スレッド数 (Lamport では4) static int turn = 0; // 次に臨界領域に入るスレッド番号 static boolean flag[]; // 臨界領域への突入宣言フラグ (Deker, Peterson で使用) static int priority[]; // 優先順位 (Lamport で使用) static boolean enter[]; // 優先順位獲得 (Lamport で使用) static int algorithmNum = 0; // 実行するアルゴリズムの番号 /* 0: 交互実行アルゴリズム * 1: Dekker のアルゴリズム * 2: Peterson のアルゴリズム * 3: Lamport のアルゴリズム */ /** * コンストラクタ * @param threadID スレッド番号 * @param latencyCS 臨界領域の中にいる時間(ミリ秒) * @param latencyNCS 非臨界領域の中にいる時間(ミリ秒) */ MutualExclusion(int threadID, long latencyCS, long latencyNCS) { /* 各フィールドに値設定 */ this.threadID = threadID; this.latencyCS = latencyCS; this.latencyNCS = latencyNCS; for (int i=0; i