0

みなさん、良い一日を!

Javaマルチスレッドの問題を解決するのに助けが必要です。問題はユニセックスのコンフォートルームです。

  1. コンフォート ルーム ユニセックスを作成します。
  2. 男性がいる場合、男性は入ることができます(その逆)
  3. 男性が使用している場合、女性は入場できません(その逆)
  4. 公正使用
  5. 飢餓はありません

これまでのところ、私は何か近いものを思いつきましたが、公正な使用に問題があり、女性を使用している男性は入ることができず、飢えています. これについて助けが必要です。

import java.util.Random;
import java.util.concurrent.Semaphore;

public class Try2 extends Thread {

    public static Semaphore USERS = new Semaphore(0);
    public static Semaphore PUBLIC_CR = new Semaphore(0);
    public static Semaphore USAGE = new Semaphore(1);

    public static final int LIST = 3;
    public static int a = 0;
    public static int c = 0;

    public static int VACANCY = LIST;

    class MEN extends Thread {

        int iD;
        boolean notUsed = true;

        public MEN(int i) {
            iD = i;
        }

        public void run() {
            while (notUsed) {
                try {
                    USAGE.acquire();
                    if (VACANCY > 0) {
                        System.out.println("MALE " + this.iD + " Is USING");
                        VACANCY--;
                        USERS.release();
                        USAGE.release();
                        try {
                            PUBLIC_CR.acquire();
                            notUsed = false;
                            this.USING_THE_CR();
                        } catch (InterruptedException ex) {
                        }
                    } else {
                        USAGE.release();
                        notUsed = false;
                    }
                } catch (InterruptedException ex) {
                }
            }
        }

        public void USING_THE_CR() {
            System.out.println("MALE " + this.iD + " is done USING the Comfort Room");
            try {
                sleep(1000);
            } catch (InterruptedException ex) {
            }
        }

    }

    class WOMEN extends Thread {

        int iD;
        boolean notUsed = true;

        public WOMEN(int i) {
            iD = i;
        }

        public void run() {
            while (notUsed) {
                try {
                    USAGE.acquire();
                    if (VACANCY > 0) {
                        System.out.println("FEMALE " + this.iD + " Is USING");
                        VACANCY--;
                        USERS.release();
                        USAGE.release();
                        try {
                            PUBLIC_CR.acquire();
                            notUsed = false;
                            this.USING_THE_CR();
                        } catch (InterruptedException ex) {
                        }
                    } else {

                        USAGE.release();
                        notUsed = false;
                    }
                } catch (InterruptedException ex) {
                }
            }
        }

        public void USING_THE_CR() {
            System.out.println("FEMALE " + this.iD + " is DONE USING the Comfort Room");
            try {
                sleep(1000);
            } catch (InterruptedException ex) {
            }
        }

    }

    class BATHROOM extends Thread {

        public BATHROOM() {
        }

        public void run() {
            while (true) {  // runs in an infinite loop
                try {
                    USERS.acquire();
                    USAGE.release();
                    VACANCY++;
                    PUBLIC_CR.release();
                    USAGE.release();
                    this.USING();
                } catch (InterruptedException ex) {
                }
            }
        }

        public void USING() {
            System.out.println("The Comfort Room is occupied");
            try {
                sleep(1000);
            } catch (InterruptedException ex) {
            }
        }
    }

    public static void main(String args[]) {

        Try2 BR = new Try2();
        BR.start();  // Let the simulation begin
    }

    public void run() {
        BATHROOM b = new BATHROOM();  //WORKING THREADS ON BATHROOM
        b.start();

        /* THIS WILL GENERATE THE USERS*/
        for (int i = 1; i < 16; i++) {

            Random random = new Random();
            int temp = random.nextInt(2);
            if (temp == 0) {
                a++;

                MEN m = new MEN(a);
                m.start();

            } else {
                c++;
                WOMEN w = new WOMEN(c);
                w.start();

            }

            try {
                sleep(2000);
            } catch (InterruptedException ex) {
            };
        }
    }
}
4

0 に答える 0